转自:http://blog.sina.com.cn/s/blog_8a18c33d0101a4bg.html
-----------------因为所有教程均有Python、Django、项目安装等, 在此不再赘述-------------------
-----------------如果转载请注明出处, 如有错误请指出, 谢谢------------------
1.创建一个项目(在此项目名称为app)
django-admin.py app
2.进入到app目录下可以看到 __init__.py, settings.py, urls.py, manage.py
__init__.py: 使当前目录变为工作目录
urls.py: 根据此文件调用对应的视图方法, 本质为URL和视图函数间的映射表, 但是视图函数必须要在Python的搜索路径中
settings.py: 项目的配置文件
manage.py: 命令行工具, 用于启动服务器等
3.启动服务器
python manage.py runserver 8000 #最后的8000为指定的运行端口, 可以去掉
载入同目录下settings.py, settings.py包含了很多配置, 比如ROO_URLCONF为哪个模块应该用作本网站的URLCONF, 默认为app.urls模块
在没有部署别的服务器的时候, 这条命令会运行Django自带的开发服务器, 但是可别把此服务器用于线上. 此开发服务器可以自动监测代码改动并自动重新载入. 所以不需要手工重启.
4.Django的工作原理
Django使用HttpRequest和HttpResponse对象在系统间传递状态.当一个页面被请求时, Django创建一个包含请求元数据的HttpRequest对象.然后Django根据urls.py调用合适的视图函数(所谓视图函数就是接受Web请求, 并返回Web响应的函数, 响应内容可以为HTML, 图片, XML, JSON等), 把HttpRequest作为视图函数的第一个参数传入(其他参数可能是由urls模块匹配出来的).每个视图函数都要负责返回一个HttpResponse对象.
当服务器收到一个HTTP请求以后, 一个服务器特定的handler(可以了解下WSGI)会创建 HttpRequest并传递给下一个组件并处理.
这个handler然后调用所有可用的Request或者View中间件, 这些类型的中间件通常是用来增强HttpRequest对象来对一些特别类型的request做些特别处理, 只要其中有一个返回HttpResponse, 系统就跳过对视图的处理.
即便是最棒的程序员也会有出错的时候, 这个时候异常处理中间件(exception middleware)可以帮你的大忙.如果一个视图函数抛出异常,控制器会传递给异常处理中间件处理.如果这个中间件没有返回HttpResponse ,意味着它不能处理这个异常,这个异常将会再次抛出.
即便是这样,你也不用担心.Django包含缺省的视图来生成友好的404和500回应(response).
最后, response middleware做发送HttpResponse给浏览器之前的后处理或者清除请求用到的相关资源.
5.HttpRequest、HttpResponse对象详解
HttpRequest对象:表示来自客户端的一个单独的HTTP请求, 包含了关于此次请求的大多数重要信息.除了session外的所有属性都应该认为是只读的.
HttpResponse对象: 与Django自动创建的HttpRequest对象相比, HttpResponse对象则是用户自己创建的. 每个视图都需要实例化、处理、返回一个HttpResponse对象.此类存在于django.http.HttpResponse.
HttpRequest对象的属性:
path: 请求页面完整的地址字符串(结尾处有斜线)-不包括域名和参数, 如 /admin/index/
method: 表示请求使用的HTTP方法, 总是大写的.
if request.method == 'GET':
do_something()
else:
do_something_else()
GET/POST/REQUEST: 类字典对象, 不可更改的, 是django.http.QueryDict的实例, 可用来获取参数信息, 分别包含了GET参数信息, POST参数信息,GET和POST综合信息(REQUEST跟PHP中一样是GET和POST的集合).
COOKIES: 标准的字典, 键值都为字符串.
FILES: 来自文件上传表单, 值为一个标准的字典, 包含三个键:filename(原文件文件名), content-type(文件的内容类型), content(文件的原始内容);
META: 包含所有的HTTP头信息, 与PHP的$_SERVER类似.包含CONTENT_LENGTH, CONTENT_TYPE, QUERY_STRING, REMOTE_ADDR, REMOTE_PORT, REMOTE_HOST, SERVER_NAME, SERVER_PORT等; 与PHP类似, 在META中有效的HTTP头信息都是代用HTTP_前缀的键. 例如:HTTP_ACCEPT_ENCODING, HTTP_HOST, HTTP_REFERER, HTTP_USER_AGENT, HTTP_ACCEPT_LANGUAGE;
user: 暂时未去了解, 待以后补上
session: 一个可读写的类字典对象, 表示当前的session.使用的前提是Django已激活session支持.
raw_post_data: POST的原始数据. 用于对数据的复杂处理.
HttpRequest对象的方法:
__getitem(key): 获取key对应的GET/POST值, 先找POST后GET, 键不存在则引发KeyError异常.该方法使用户可以以访问字典的方式来访问一个HttpRequest实例. 如request['name'], 和先检查request.GET或request.POST是否包含所给的键一样.
has_key(): 获取request.GET或者request.POST中是否包含所给的键, 返回True或者False
get_full_path(): 返回path, 与request.path不同的是包含请求参数
is_secure(): 返回请求是否是以HTTPS形式提交的.
HttpResponse:
以字符串的形式传递页面的内容给HttpResponse的构造函数.可以配置返回头.
response = HttpResponse("Here is the text of the Web page.")
response = HttpResponse("Text only, please.", mimetype="text/plain")
可以把response当做一个类文件对象使用.
response = HttpResponse()
response.write("Here is the text of the Web page.")
response.write("Here is another paragraph.")
HttpResponse子类:
HttpResponseRedirect: 构造函数参数为重定向的路径.可以为一个完整的URL地址('http://www.baidu.com/a/b/')或不包括域名的路径('/a/b/').返回的状态码为302重定向.
HttpResponseNotModified:无修改, 返回304状态码/
HttpResponseBadRequest: 类似HttpResponse, 返回400状态码.
HttpResponseNotFound: 类似HttpResponse, 返回404状态码.
HttpResponseForbidden: 类似HttpResponse, 返回403状态码.
HttpResponseServerError: 类似HttpResponse, 返回500状态码.
以上几个都可以代替HttpResponse返回.
6.urls.py详解(此决定了与PHP文件夹层次调用文件的不同)
url.py的本质为URL和视图函数间的映射表(视图函数必须要在Python的搜索路径中, Django项目的搜索路径是在manage.py文件中添加进去的, 可以看一下), 是根据request.path进行匹配的.同时此模块可以匹配出除了request之外的第二个, 第三个等参数(比如url(r'^admin/user/(\w)+/$', 'mysite.views.admin'), 此时mysite.views.main视图函数可以接受第二个参数).但是所有的参数全为字符串.也可以用正则进行匹配, 这里面可不要乱加空格, 我就出现错误了.
文件内容如下:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
# url(r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# url(r'^admin/', include(admin.site.urls)),
)
第一行, 从django.conf.urls下导入patterns, include, url函数
第二行, 调用patterns函数, 并将返回结果保存到urlpatterns变量. patterns()函数第一个参数为视图函数通用前缀, 即公用前缀. urlpatterns即代表了URL到视图函数的映射关系.此处匹配的时候比如随便一个匹配(r'^admin/$', 'mysite.views.admin'), ^$是很重要的分隔符, 进行精确匹配, 如果去掉^则有可能匹配到任意由admin/结束的path, 比如/a/b/admin/等, 而且不必写成^/admin/$, 因为Django进行匹配的时候会自动把前面的"/"加上.