<Django Web开发指南>读书笔记一

第一部分 入门
第一章 Django Python实战
1.3 Python基础
注释:Python的注释是用井字符(#)表示的。
变量和赋值:Python是动态类型的语言,不要先为之声明一个特定的类型。
1.4 Python标准类型
对象的布尔值: 所有的Python值都可以表示为布尔值。None在做判断时总是为False。
序列和迭代
序列是一种可以让你每次获取一个元素的类型。列表是可变的,可以改变大小的序列,它能够保存任何数据类型。
元祖是不可改变的。单个元素的元祖要求在最后必须跟一个逗号。
字典是映射类型,它是可变的,无序的,大小可变的键值映射。

1.6 异常处理
如果在运行时发生异常的话,解释权会查找相应的处理语句(handler)。要是再当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。如果在最外层(全局"main")还是没有找到的话,解释器就会退出,同时打印traceback以便让用户找出错误产生的原因。

1.7 文件
一个文件对象本身就是一个迭代器

1.8 函数
声明和调用函数,使用def关键字。
关键字参数:通过"键=值"的形式加以指定
默认参数:参数的默认值是在函数签名里面用等于号直接指定的。
函数是First-Class对象。当执行def语句的时候,实际上是在创建一个函数对象并将其赋值或绑定到当前名字空间里的一个名字上。
匿名函数:使用lambda关键字。
装饰器:Python的装饰器指的是一种让你能改变或者说"装饰"函数行为的机制,它能让函数执行一些和原本设计不同,或是在原有基础上额外的操作。

1.9 面向对象编程
类的定义:使用class关键字。
变量self指向的是类的一个特定的实例。
实例化:在Python里只要像调用函数一样调用类的名字就可以了。

1.10 正则表达式
re模块:re.search返回一个匹配对象,可以用这个对象的group或groups方法获取匹配的模式。
查找和匹配: 查找是在目标字符串里搜寻任何匹配的模式,而匹配则表示整个字符串都必须要符合模式的描述。

1.11 常见错误
一个模块可以被导入任意多次,但是它只会被加载一次。
可改变性:指的是一个对象的值能否改变。所有Python对象都有三个属性:类型、标识符和值。标识符指的是运行在解释器里所有对象都有的唯一的一个标识号。

复制对象和可改变性
不可变对象(比如整数)被真正复制,而可变对象只是复制了一个对它们的引用。即在内存中只有一份对象,而有两份引用。

第二章 Django速成:构建一个Blog
2.1 创建项目
项目:一个包含了组成单个网站的所有文件目录。使用django-admin.py
django-admin.y startproject mysite
settings.py:包含了项目的默认设置。包括数据库信息,调试标志以及其他一些重要的变量。
urls.py文件在Django里叫URLconf,它是一个将URL模式映射到你应用程序的配置文件。

2.2 运行开发服务器
python manage.py runserver

2.3 创建Blog应用
python manage.py startapp blog
要告诉Django这个app是项目里的一部分,需要去编辑settings.py文件。打开配置文件并在文件里找到INSTALLED_APPS。把你的app以模块的形式添加到元祖:'mysite.blog', (注意结尾的逗号)。
Django用INSTALLED_APPS来决定系统里不同部分的配置,包括自动化的admin应用以及测试框架。

2.4 设计你的Model
from django.db import models

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField
注意:Django会默认为每个model自动加上一个自增的、唯一的id变量。
这个新建的BlogPost类是django.db.models.Model的一个子类。每一个变量都和普通的类属性一样被定义为一个特定变量类(field class)的实例。

2.5 设置数据库
使用数据库服务器
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'C:\\Eclipse\\workspace\\mysite\\sqlite.db',    

创建表
python manage.py syncdb
当你执行suncdb的时候,Django会查找INSTALLED_APPS里的每一个models.py文件,并为找到的每一个model都创建一张数据库表。INSTALLED_APPS里的其他默认条目也都拥有model。

2.6 设置自动admin应用
打开settings.py文件并在INSTALLED_APPS元祖里的'django.contrib.auth',下面添加'django.contrib.admin',
每次往项目里添加新的应用后,都要运行一下syncdb命令确保它所需的表已经在数据库里创建了。
设置完app后,需要为它指定一个URL这样才能访问它。在urls.py文件中
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
    
最后,你的应用程序需要告诉Django要在admin窗口里显示哪一个model以供编辑。只要定义之前提到的admin站点,并向其注册BlogPost model就行了。

2.7 试用admin
再次运行python manage.py runserver命令,在浏览器中输入http://127.0.0.1:8000/admin/
三个最常见的"我的app没有显示在admin里"的原因是
1. 忘记向admin.site.register注册你的model类
2. models.py里面有错误
3. 忘记在settings.py中得INSTALLED_APP里添加app
更新mysite/blog/models.py文件,添加以供BlogPostAdmin类,并将它加到注册代码那一行。
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'timestamp')
    
admin.site.register(BlogPost, BlogPostAdmin)
开发服务器会注意到你的修改并自动重新加载model文件。

2.8 建立Blog的公共部分
一个页面具有三个典型的组件:
1. 一个模板(template),模板负责将传递进来的信息显示出来(用一种类似Python字典的对象Context)
2. 一个视图(view)函数,它负责获取要显示你的信息,通常都是从数据库里取得。
3. 一个URL模式,它用来把收到的请求和你的视图函数匹配,有时也会向视图传递一些参数。

创建模板
它就是一个HTML加上一些大括号里的特殊模板标签。这些是变量标签(variable tag),用于显示传递给模板的数据。在变量标签里,你可以用Python风格的dotter-notation(点记号)来访问传递给模板的的对象的属性。
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{post.timestamp}}</p>
<p>{{ post.body }}</p>
{% endfor %}

for块标签,用它将模板渲染到序列中的每个元素上。块标签是包含在{% .. %}里。
Django在默认情况下会在搜索模板时逐个查看你安装的应用程序下的每一个templates目录。

创建一个视图函数
编写一个从数据库读取所有blog帖子的视图函数,并用我们的模板将它们显示出来。打开blog/views.py输入:
from django.template import loader, Context
from django.http import HttpResponse
from mysite.blog.models import BlogPost

def archive(request):
    posts = BlogPost.objects.all()
    t = loader.get_template("archive.html")
    c = Context({"posts": posts})
    return HttpResponse(t.render(c))

1. 每个Django视图函数都将django.http.HttpRequest对象作为它的第一个参数。它还可以通过URLconf介绍其他参数。
2. 把BlogPost类作为django.db.model.Model的一个子类时,就获得了Django对象关系映射的全部力量。这一行只是使用ORM(对象关系映射)获取数据库里所有BlogPost对象。
3. 告诉Django模板的名字就能创建模板对象t,因为我们保存在app下的templates目录。
4. Django模板渲染的数据是由一个字典类的对象context提供的,这里的context c只有一对键和值。
5. 每个Django视图函数都会返回一个django.http.HttpResponse对象。最简单的就是给其构造函数传递一个字符串。这里模板的render方法返回的正是一个字符串。

创建一个URL模式。
第一步和激活admin很相似。在mysite/urls.py里面有一行被注释的代码,改成:
    url(r'^blog/', include('mysite.blog.urls')),
这会捕捉任何以blog/开始的请求,并把它们传递给一个你马上要新建的URLconf。
第二步是在blog应用程序包里定义URL。创建一个包含如下内容的新文件:mysite/blog/urls.py
from django.conf.urls.defaults import *
from mysite.blog.views import archive

urlpatterns = patterns('', url(r'^$', archive))
URL请求和根URLconf匹配的blog/已经被去掉了--这样blog应该程序就变得可以重用了。urlpatterns里的正则表达式可以匹配任何URL,比如/blog/。
视图函数archive是在模式元祖第二部分提供的。(注意我们传递的不是函数的名字,而是一个first-class的函数对象。当然用字符串也行)
执行manage.py runserver启动开发服务器,在浏览器里输入http://localhost:8000/blog/,你可以看到一个页面,显示所有你输入的blog帖子,有标题、发布时间和帖子本身。

2.9 最后的润色
模板的精确定位:
在Django里的争取的做法是创建一个基础模板,然后在这基础上扩展出其他特定模板来。
在mysite/blog/templates目录下,创建一个叫base.html的模板,内容如下:
<html>
    <style>
        body {color: #efd; background: #453; padding: 0 5em; margin: 0}
        h1 {padding: 2em 1em; background: #675}
        h2 {color: #bf8; border-top: 1px dotted #fff; margin-top: 2em}
        p {margin: 1em 0}
    </style>
    <body>
        <h1>mysite.example.com</h1>
        {% block content %}
        {% endblock %}
    </body>
</html>

注意    {% block content %}标签,它定义了一个子模板可以修改的命名块(named block)。修改archive.html模板,让它引用新的基础模板和它的content块,就能在blog app里使用它了。
{% extends "base.html" %}
{% block content %}
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{post.timestamp}}</p>
<p>{{ post.body }}</p>
{% endfor %}
{% end block %}
这里的{% extends ...%}标签告诉Django去找一个叫base.html的标签,并将这个模板里命名块的所有内容填入到那个模板里相应的块里去。

按日期排序
可以在model里加入一个默认的顺序,或者在视图代码里的BlogPost.objects().all()上添加排序功能。如果在model里设置我们想要的排序方式,Django里任何访问数据的部分都会采用这个排序结果。
设置model默认排序的方法是给它设定一个Meta嵌套类。然后设置ordering属性。
    class Meta:
        ordering = ('-timestamp', ) #千万不要忘了小括号结尾的那个逗号,它代表的是一个单元素的元祖,而不是一个带小括号的字符串。Django在这里要的是一个元祖,你可以排序任意数目的变量。
现在看一下blog的首页(/blog/)。最新的帖子应该出现在页面最上方了。字符串"-timestamp"告诉Django对"timestamp"变量安装降序排列。(如果省略"-"的话则是按升序排列)

通过模板过滤器格式化时间戳。
打开archive.html文件并修改post.timestamp一行。
<p>{{post.timestamp|date}}</p>
也可以传递一个strftime风格的格式化字符串作为它的参数。
<p>{{ post.timestamp|date:"1, F jS" }}</p>
注意不要在冒号两边留有空格--Django的模板引擎对空格敏感。

第三章 起始
3.1 动态网站基础
用户向Web服务请求一个文档;Web服务器随即获取或生成这个文档;服务器再把结果返回给用户的浏览器;最后浏览器将这个文档渲染出来。

通信: HTTP、URL、请求、响应
HTTP主要是由请求(request, 客户端到服务器端)和响应(response, 服务器端到客户端)两个部分组成。请求封装了过程的第一部分--客户端向服务器端要求一个给定的文档。请求的核心就是URL(指向所需文档的"路径"),当然可以通过一系列方法进一步参数化,让单个的地址或URL展现多种行为。
响应主要是由一个正文(body, 通常是web页面的文本)和相应的包头(header)组成。包头里是关于所需数据的额外信息。另外,响应里非HTML的内容可以是纯文本、文档、声音片段等。
Django将请求和响应表示成相对简单的Python对象,用属性来表示其数据,以及用方法来进行更复杂的操作。

数据存储:SQL和关系数据库
Django提供了一个强大的ORM机制,Python的类就代表了表,对象代表了其中的每一行,而对象的属性则代表了列。

表示:将模板渲染成HTML或其他格式

组合在一起
3.2 理解模型、视图和模板
分层(MVC):应用程序被分割成模型(控制数据),视图(定义显示的方法),以及控制器(在两者之间斡旋,并且让用户可以请求和操作数据)

Django的办法
首先模型部分保持不变:Django的模型只负责把数据传入传出数据库。Django里的视图并不是显示数据的最后一步--Django的视图其实更接近MVC里传统意义上的控制器。它们是用来将模型层和表示层连接在一起的Python函数。

模型
视图:
它们是链接到一个或多个定义URL上的Python函数。这些函数都返回一个HTTP响应对象。
模板

3.3 Django架构总览
收到的HTTP请求被Web服务器转发给Django,Django在请求的中间件层接受它们。随后根据URLconf模式匹配分配到是和的视图上去,视图会执行所需工作的核心部分,用模型(model)和/或模板(template)按需要生成响应。随后响应再次穿过中间件层进行最后的处理,最后将HTTP响应返回给Web服务器并转发给用户。
作者:Shane
出处:http://bluescorpio.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/bluescorpio/p/2475804.html