创建项目流程
- 创建项目django-admin startproject test3
- 进入项目目录,创建应用python manage.py startapp booktest
- 在test3/settings.py中INSTALLED_APPS项安装应用
- 在test3/settings.py中DATABASES项配置使用MySQL数据库
- 在test3/settings.py中TEMPLATES项中DIRS中配置模板查找路径
‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)] - 创建模板目录
- 打开test3/urls.py文件,包含booktest的url配置。
- 在booktest/目录下创建urls.py,配置url。
视图
- 接收请求,进行处理,与M和T进行交互,返回应答。
- 返回html内容 HttpResponse,也可能重定向 redirect,还可以返回json数据。
使用视图
视图就是一个python函数,被定义在"应用/views.py"文件中。 使用视图时需要进行两方面操作,两个操作不分先后。
-
在"应用/views.py"中定义视图
request参数必须有。是一个HttpRequest类型的对象。参数名可以变化,
但不要更改。 -
配置URLconf,将视图函数和url对应起来。
建立url和视图函数之间的对应关系。
url配置的过程
- 在项目的urls文件中包含具体应用的urls文件,在具体应用的urls文件中包含具体url和视图的对应关系。
- url配置项是定义在一个名叫urlpatterns的列表中,其中的每一个元素就是一个配置项,每一个配置项都调用url函数。
语法
-
包含,一般在自定义应用中创建一个urls.py来定义url。
这种语法用于test3/urls.py中,目的是将应用的urls配置到应用内部,数据更清晰并且易于维护。
url(正则,include(‘应用.urls’)) -
定义,指定URL和视图函数的对应关系。
在应用内部创建urls.py文件,指定请求地址与视图的对应关系。
url(正则,‘视图函数名称’)
url匹配的过程
url:http://127.0.0.1:8000/aindex?a=1
- 去除域名和后面的参数,剩下/aindex,再把前面的/去掉,剩下aindex
- 拿aindex先到项目的url.py文件中进行从上到下的匹配,匹配成功之后执行后面对应的处理动作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到应用的urls.py文件中再进行从上到下的匹配。
- 如果匹配成功则调用相应的视图产生内容返回给客户端。如果匹配失败则产生404错误。
捕获url参数
进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数。
-
位置参数
位置参数,参数名可以随意指定
直接使用小括号,通过位置参数传递给视图。-
为了提取参数,修改上面的正则表达式如下
url(r’^delete(\d+)/$’,views.show_arg) -
修改视图show_arg如下:
注意:参数的名字是任意的如a1、b8,尽量做到见名知意。
def show_arg(request,id):
return HttpResponse(’ %s’%id)
-
-
关键字参数:在位置参数的基础上给正则表达式组命名即可。
?P<组名>
关键字参数,视图中参数名必须和正则表达式组名一致.- 修改正则表达式如下:
其中?P部分表示为这个参数定义的名称为id,可以是其它名称,起名做到见名知意。
url(r’^delete(?P< id1>\d+)/$’,views.show_arg), - 修改视图show_arg如下:
注意:视图show_arg此时必须要有一个参数名为id1,否则报错。
def show_arg(request,id1):
return HttpResponse(‘show %s’%id1)
- 修改正则表达式如下:
错误视图
- 404错误:page not found视图
- 500错误:server error视图
- 将请求地址进行url匹配后,没有找到匹配的正则表达式,则调用404/500视图,这个视图会调用404/500.html的模板进行渲染。视图传递变量request_path给模板,表示导致错误的URL。
Django中 默认开启DEBUG调试模式。如果想看到错误视图而不是调试信息,需要修改test3/setting.py文件的DEBUG项。
DEBUG = False
ALLOWED_HOSTS = [’*’, ]
自定义错误视图
如果要显示自定义的页面,则需要的templates目录下面自定义一个404.html文件。 主要是这个{{request_path}}
- 在templates中创建404/500.html。
- 定义代码如下:
<html> <head> <title></title> </head> <body> 找不到了 <hr/> {{request_path}} </body> </html>
HttpReqeust对象
属性
-
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
-
method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
- 在浏览器中给出地址发出请求采用get方式,如超链接。
- 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
-
encoding:一个字符串,表示提交的数据的编码方式。
- 如果为None则表示使用浏览器的默认设置,一般为utf-8。
- 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
-
GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。
-
POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。
-
FILES:一个类似于字典的对象,包含所有的上传文件。
-
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
-
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。
QueryDict对象
- 定义在django.http.QueryDict
- HttpRequest对象的属性GET、POST都是QueryDict类型的对象
- 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
- 方法get():根据键获取值
- 如果一个键同时拥有多个值将获取最后一个值
- 如果键不存在则返回None值,可以设置默认值进行后续处理
dict.get(‘键’,默认值)
可简写为
dict[‘键’] - 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
- 如果键不存在则返回空列表[],可以设置默认值进行后续处理
dict.getlist(‘键’,默认值)
GET属性
请求格式:在请求地址结尾使用?,之后以"键=值"的格式拼接,多个键值对之间以&连接。
- 在Django中可以使用HttpRequest对象的GET属性获得get方方式请求的参数。
- GET属性是一个QueryDict类型的对象,键和值都是字符串类型。
- 键是开发人员在编写代码时确定下来的。
- 值是根据数据生成的。
POST属性
使用form表单请求时,method方式为post则会发起post方式的请求,需要使用HttpRequest对象的POST属性接收参数,POST属性是一个QueryDict类型的对象。
- 表单控件name属性的值作为键,value属性的值为值,构成键值对提交。
- 如果表单控件没有name属性则不提交。
- 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况。
- 键是表单控件name属性的值,是由开发人员编写的。
- 值是用户填写或选择的。
HttpResponse对象
视图在接收请求并处理后,必须返回HttpResponse对象或子对象。在django.http模块中定义了HttpResponse对象的API。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。
属性
- content:表示返回的内容。
- charset:表示response采用的编码字符集,默认为utf-8。
- status_code:返回的HTTP响应状态码。
- content-type:指定返回数据的的MIME类型,默认为’text/html’。
方法
- _ init_:创建HttpResponse对象后完成返回内容的初始化。
- set_cookie:设置Cookie信息。
- set_cookie(key, value=’’, max_age=None, expires=None)
- cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。
- max_age是一个整数,表示在指定秒数后过期。
- expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
- max_age与expires二选一。
- 如果不指定过期时间,在关闭浏览器时cookie会过期。
- delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生。
- write:向响应体中写数据。
直接返回数据
- 打开booktest/views.py文件,定义视图index2如下:
def index2(request): str='<h1>hello world</h1>' return HttpResponse(str)
2.打开booktest/urls.py文件,配置urlurl(r'^index2/$',views.index2),
调用模板
可以将html、css、js定义到一个html文件中,然后由视图来调用。
- 打开booktest/views.py文件,定义视图index3如下:
from django.template import RequestContext, loader
...
def index3(request):
#加载模板
t1=loader.get_template('booktest/index3.html')
#构造上下文
context=RequestContext(request,{'h1':'hello'})
#使用上下文渲染模板,生成字符串后返回响应对象
return HttpResponse(t1.render(context))
-
打开booktest/urls.py文件,配置url。
url(r'^index3/$',views.index3),
-
在templates/booktest/目录下创建index3.html,代码如下:
<html>
<head>
<title>使用模板</title>
</head>
<body>
<h1>{{h1}}</h1>
</body>
</html>
调用模板简写函数render
每次调用模板时都要执行加载、上下文、渲染三个步骤,为了简化操作,Django定义了render()函数封装了以上三个步骤的代码,定义在django.shortcuts模块中。
打开booktest/views.py文件,定义视图index3如下:
from django.shortcuts import render
...
def index3(request):
return render(request, 'booktest/index3.html', {'h1': 'hello'})
子类JsonResponse
在浏览器中使用javascript发起ajax请求时,返回json格式的数据,此处以jquery的get()方法为例。类JsonResponse继承自HttpResponse对象,被定义在django.http模块中,创建对象时接收字典作为参数。
JsonResponse对象的content-type为'application/json'。
例子
1)在booktest/views.py文件中定义视图json1、json2,代码如下:
from django.http import JsonResponse
...
def json1(request):
return render(request,'booktest/json1.html')
def json2(request):
return JsonResponse({'h1':'hello','h2':'world'})
2)在booktest/urls.py文件中配置url。
url(r'^json1/$', views.json1),
url(r'^json2/$', views.json2),
3)创建目录static/js/,把jquery文件拷贝到js目录下。
4)打开test3/settings.py文件,在文件最底部,配置静态文件查找路径,并且要求开启调试
DEBUG = True
...
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
5)在templates/booktest/目录下创建json1.html,代码如下:
<html>
<head>
<title>json</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
$('#btnJson').click(function () {
$.get('/json2/',function (data) {
ul=$('#jsonList');
ul.append('<li>'+data['h1']+'</li>')
ul.append('<li>'+data['h2']+'</li>')
})
});
});
</script>
</head>
<body>
<input type="button" id="btnJson" value="获取json数据">
<ul id="jsonList"></ul>
</body>
</html>
ajax代码执行过程
- 发起请求。
- 服务器端视图函数执行。
- 执行回调函数。
Ajax登录案例
- 首先分析出请求地址时需要携带的参数。
- 视图函数处理完成之后,所返回的json的格式。
- 显示出登录页面
- 设计url,通过浏览器访问 http://127.0.0.1:8000/login_ajax 时显示登录页面。
- 设计url对应的视图函数login_ajax。
- 编写模板文件login_ajax.html。
在里面写jquery代码发起ajax请求。
- 登录校验功能
- 设计url,点击登录页的登录按钮发起请求http://127.0.0.1:8000/login_ajax_check时进行登录校验。
- 设计url对应的视图函数login_ajax_check。
接收post提交过来的数据。
进行登录校验,并返回json内容。 JsonRepsone
- Json格式如下:
{‘res’:‘1’} #表示登录成功
{‘res’:‘0’} #表示登录失败
子类HttpResponseRedirect
Django中提供了HttpResponseRedirect对象实现重定向功能,这个类继承自HttpResponse,被定义在django.http模块中,返回的状态码为302。
例子:
1)在booktest/views.py文件中定义视图red1,代码如下:
from django.http import HttpResponseRedirect
...
# 定义重定义向视图,转向首页
def red1(request):
return HttpResponseRedirect('/')
2)在booktest/urls.py文件中配置url。
url(r'^red1/$', views.red1),
重定向简写函数redirect
- 在django.shortcuts模块中为重定向类提供了简写函数redirect。
修改booktest/views.py文件中red1视图,代码如下:
from django.shortcuts import redirect
...
def red1(request):
return redirect('/')
状态保持
有时需要保存下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等。 实现状态保持主要有两种方式:
- 在客户端存储信息使用Cookie。
- 在服务器端存储信息使用Session。
Cookie
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。
- Cookie的特点
- 以键值对方式进行存储。
- 通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。request.COOKIES
- cookie是基于域名安全的。www.baidu.com www.tudou.com
- cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。
Session
- session的特点:
- session是以键值对进行存储的。
- session依赖于cookie。唯一的标识码保存在sessionid cookie中。
- session也是有过期时间,如果不指定,默认两周就会过期。
对象及方法
通过HttpRequest对象的session属性进行会话的读写操作。
-
以键值对的格式写session。
request.session[‘键’]=值 -
根据键读取值。
request.session.get(‘键’,默认值) -
清除所有session,在存储中删除值部分。
request.session.clear() -
清除session数据,在存储中删除session的整条数据。
request.session.flush() -
删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session[‘键’] -
设置会话的超时时间,如果没有指定过期时间则两个星期后过期。
request.session.set_expiry(value)
- 如果value是一个整数,会话将在value秒没有活动后过期。
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
- 如果value为None,那么会话永不过期。