一、URLconf
用户在通过浏览器访问网址请求网站的时候,是通过url找到对应的函数进行执行,而Django中的url配置在与项目同名的文件夹下的settings.py中进行配置
1、配置
(1)、test1/settings.py配置文件
settings.py中默认已经通过ROOT_URLCONF指定了url的配置,指向的是test1下的urls.py文件:
(2)、test1/urls.py中配置项如下:
注意:
在test1/urls.py中进行包含配置,在各自应用中创建对应的urls.py,在每个应用下的urls.py文件中进行具体的配置。
定义urlpartterns列表,存储url( )对象,这个列表名称是固定的。
2、url定义的语法
url( )对象被定义在django.conf.urls包中,由两种语法结构
(1)、语法一:包含,在项目同名文件夹下的urls.py中包含其他应用的urls.py
在自定义的应用中创建一个urls.py文件来定义url( ),然后在项目同名文件夹下的urls.py中将自定义的urls.py引入,这样做的目的是将urls.py配置到应用内部,数据更清晰且易于维护。
test1/urls.py中引入booktest/urls.py的语法
url(r'^',include('应用名称.urls')), # 此处的urls指的是各自应用(booktest)中urls.py文件的名称,如果是urls.py,即为urls
(2)、语法二:定义,指定URL和视图函数的对应关系
在各自应用内部创建urls.py,指定请求地址与视图的对应关系,格式如下:
url(正则,'视图函数名称')
示例:
booktest/urls.py中创建首页的url:
from django.conf.urls import url from booktest import views urlpatterns=[ url(r'^$',views.index), ]
注意:正则部分推荐使用r,表示字符串不转义,这样在正则表达式中使用\只写一个就可以。 不能在开始加反斜杠,推荐在结束加反斜杠,因为浏览器的url在结尾加\和不加都一样。
3、获取url中携带的参数值
请求的url被看作是一个普通的python字符串,进行匹配不包括域名、get或者post的请求参数,如:请求地址如下:
http://localhost:8080/detail/1?a=10
以上请求地址中,与url( )函数中正则匹配的字符串只有:detail/
如果想在请求的url中携带RESTFUL风格的参数,需要在url( )函数的正则表达式中是用分组,即使用()号,分为:位置参数、关键字参数。
注意:两种参数方式不要混合使用,在一个正则表达式中只能使用一种参数方式。
(1)、位置参数
直接使用()号,通过位置参数传递给视图
如访问的url 为: http://localhost:8000/show_books/1?a=10
在url( )函数中的正则表达式写法为:
url(r'^detail(\d+)/$',views.show_books),
views.py中对应的函数写法为:
def show_books(request, id): # 此处获取的id为1 return HttpResponse('show_books')
(2)、关键字参数
使用关键字参数,则在url()函数中的正则表达式分组是,为每个组命名
如访问的url为:http://localhost:8000/delete/1?a=10
在url()函数的正则表达式写法为:
url(r'^delete(?P<id1>\d+)/$',views.show_book),
在views.py中的函数写法为:
def show_arg(request,id1): return HttpResponse('show %s'%id1)
注意:如果使用关键字参数的话,则views.py中对应的函数的参数名称必须和正则表达式中组的命名一直,否则将报错。
二、视图
1、什么是视图
视图就是python中的函数,视图一般被定义在"应用/views.py"文件中,即本例的"booktest/views.py"中。
视图必须返回一个HttpResponse对象或者子对象作为响应。响应可以是一张网页的HTML内容,也可以是一个重定向(redirect)函数,或者一个404错误等。
视图的第一个参数必须是HttpRequest对象,其他参数还可能包括:关键字参数或者位置参数(二者取其一)
2、内置错误视图
(1)、内置错误视图
Django内置处理HTTP错误的视图,主要错误及视图包括:
404:page not found 视图
500:server error 视图
如果想看到错误视图,而不是调试信息,需要修改"test/settings.py"文件中的DEBUG项配置信息
(2)、404错误及视图
将请求地址进行url匹配之后,没有找到匹配的正则表达式,则调用404视图,这个视图会调用404.html模版进行渲染,视图传递变量request_path给模版,表示导致错误的URL。
在templates中创建404.html
<html> <head> <title></title> </head> <body> 找不到了 <hr/> {{request_path}} </body> </html>
在浏览器中输入如下网址:
http://localhost:8000/test/
运行效果如下:
(3)、500错误及视图
在视图中代码运行报错将会发生500错误,调用内置错误视图,使用templates/500.html模版进行渲染。
三、HttpRequest对象
1、HttpRequest对象
服务器接收到HTTP请求后,会根据报文创建HttpRequest对象,这个对象不需要我们手动创建,直接使用服务器构建好的对象即可。视图函数中的第一个参数必须是HttpRequest对象,该对象类定义在django.http模块中。
2、属性
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
在浏览器中给出地址发出请求采用get方式,如超链接。
在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
使用post请求接收参数时,需要在settings.py中进行一下设置:
encoding:一个字符串,表示提交的数据的编码方式。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。
POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。
FILES:一个类似于字典的对象,包含所有的上传文件。
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。
3、QueryDict对象
定义在django.http.QueryDict
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
方法get():根据键获取值
如果一个键同时拥有多个值将获取最后一个值
如果键不存在则返回None值,可以设置默认值进行后续处理
dict.get('键',默认值) 可简写为 dict['键']
方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理
dict.getlist('键',默认值)
4、GET属性
Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数,GET属性是一个QueryDict类型的对象,键和值都是字符串类型。
5、POST属性
Django中可以使用HttpRequest对象的POST属性获得post方式请求的参数,POST属性是一个QueryDict类型的对象。
6、GET和POST方式提交参数获取示例
(1)、在views.py中创建函数
(2)、在booktest/urls.py中配置对应的url( )
(3)、在模版目录中编写index.html模版、show_get_args.html模版、show_post_args.html模版
index.html
<html> <head> <title>首页</title> </head> <body> 3.提交数据的两种方式: get方式:<br/> <a href="/show_req_arg/?a=1&b=2&c=python">get方式提交数据</a><br/><br/> post方式:<br/> <form method="post" action="/show_req_arg/"> 姓名:<input type="text" name="uname"><br/> 性别: 男<input type="radio" name="gender" value="男"/> 女<input type="radio" name="gender" value="女"/><br/> 爱好: 吃饭<input type="checkbox" name="hobby" value="吃饭"/> 睡觉<input type="checkbox" name="hobby" value="睡觉"/> 打豆豆<input type="checkbox" name="hobby" value="打豆豆"/><br> <input type="submit" value="提交"> </form> <br/> </body> </html>
show_get_args.html
<html> <head> <title>GET方式提交数据</title> </head> <body> a:{{ a }}<br/> b:{{ b }}<br/> c:{{ c }}<br/> </body> </html>
show_post_args.html
<html> <head> <title>POST方式提交数据</title> </head> <body> name:{{ name }}<br/> gender:{{ gender }}<br/> hobbys: <ul> {% for hobby in hobbys %} <li>{{ hobby }}</li> {% endfor %} </ul> </body> </html>
(4)、启动服务,访问index页面,分别点击get和post请求,查看页面效果
四、HttpResponse对象
1、什么是HttpResponse
视图在接收请求并处理之后,必须返回HttpResponse对象或者子对象。在django.http模块中定义了HttpResponse对象的API。HttpRequest对象由django框架创建,HttpResponse对象由调用者(开发人员)创建。
2、属性
content:表示返回的内容。
charset:表示response采用的编码字符集,默认为utf-8。
status_code:返回的HTTP响应状态码。
content-type:指定返回数据的的MIME类型,默认为'text/html'。
3、方法
_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:向响应体中写数据。
4、HttpResponse应用示例
(1)、直接返回数据
def index(request): return HttpResponse('直接返回到浏览器的数据')
(2)、调用模版
from django.template import RequestContext,loader def index(request): # 加载模版 temp = loader.get_template('booktest/index.html') # 构造上下文 context = RequestContext(request, {'a': 'hello'}) # 使用上下文渲染模版,生成字符串后返回 return HttpResponse(temp.render(context))
(3)、调用模版简写函数render
每次调用模板时都要执行加载模版、构造上下文、渲染三个步骤,为了简化操作,Django定义了render()函数封装了以上三个步骤的代码,定义在django.shortcuts模块中。
from django.shortcuts import render def index(request): return render(request, 'booktest/index3.html', {'h1': 'hello'})
5、子类JsonResponse
(1)、JsonResponse以及ajax介绍
在浏览器中使用javascript发起ajax请求,返回json格式的数据。类JsonResponse继承自HttpResponse,被定义在django.http模块中,创建对象时接收字典作为参数。
在HTML中使用ajax需要导入js文件,导入导入js文件需要在test1/settings.py中配置静态文件的路径,配置信息如下:
ajax执行流程:
①、发起请求
②、服务器端视图函数执行
③、执行回调函数
(2)、html页面调用ajax发送请求示例
在views.py中定义视图函数
在urls.py中配置url( )函数
在test1下创建static/js目录,用来放置js文件
创建json.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>
浏览器运行测试
6、子类HttpResponseRedirect
当一个逻辑处理完成之后,不需要向浏览器呈现数据,而是转回到其他的请求(添加成功跳转到列表页面),此时就要模拟一个用户的请求,从一个视图函数转到另一个视图函数,就称之为重定向(redirect)。
(1)、重定向中views.py视图函数示例
from django.http import HttpResponseRedirect # 定义重定义向视图,转向首页index def red(request): return HttpResponseRedirect('/index')
(2)、重定向简写函数redirect示例
from django.shortcuts import redirect def red1(request): return redirect('/index')
五、状态保持
1、Cookie
(1)、cookie的特点
Cookie以键值对的格式进行信息的存储。
Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息。
当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器。
(2)、设置cookie
在views.py中编写视图函数
配置urls.py中的url( )函数
浏览器访问,开发者工具查看cookie信息
(3)、读取cookie
Cookie信息被包含在请求头中,使用request对象的COOKIES属性访问。
创建cookie_get视图函数
配置url
浏览器访问
2、session
对于敏感、重要的信息,建议要储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息。在服务器端进行状态保持的方案就是Session。
(1)、启用session
Django框架默认已经启动了session,启用session的配置在settings.py中,配置如下:
注意:禁用session只需要将session中间件从MIDDLEWARE_CLASSES配置项中删除即可
(2)、储存方式
在settings.py中的SESSION_ENGINE配置项可以设置session数据的存储方式(存储在数据库、缓存、redis中等)
①、存储在数据库中,默认是将session存储在数据库中,以下配置可写可不写
SESSION_ENGINE='django.contrib.sessions.backends.db'
存储在数据库中,需要在settings.py中的INSTALLED_APPS中安装Session应用,配置如下:
迁移之后,在数据库中会创建出存储session的表:
②、存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
③、混合存储:优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
(3)、依赖于cookie
在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session。存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置。
(4)、对象及方法
通过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,那么会话永不过期。
(5)、示例
①、写session
创建session_set视图函数
# 写session操作 def session_set(request): """写session操作""" request.session['h1'] = 'hello' return HttpResponse('写Session')
配置url函数
运行服务器,查看浏览器效果
查看MySQL数据库中的session数据
②、读session
创建session_get视图函数
# 读session操作的视图 def session_get(request): """读取session中的数据""" h1 = request.session.get('h1') return HttpResponse(h1)
配置url函数
运行服务器,查看浏览器效果
③、删除session
创建session_del视图函数
# 删除session def session_del(request): """删除session的操作""" del request.session['h1'] return HttpResponse('删除成功')
配置url
# 删除session操作的url url(r'^session_del$', views.session_del),
启动服务,访问浏览器,查看数据库session数据
3、使用redis存储session
会话还支持文件、纯cookie、Memcached、Redis等方式存储
(1)、安装redis的包,开启redis
pip install django-redis-sessions==0.5.6
(2)、修改settings.py文件,添加如下内容
SESSION_ENGINE = 'redis_sessions.session' SESSION_REDIS_HOST = 'localhost' SESSION_REDIS_PORT = 6379 SESSION_REDIS_DB = 2 SESSION_REDIS_PASSWORD = '' SESSION_REDIS_PREFIX = 'session'
(3)、编写session_redis视图函数
(4)、配置url
(5)、启动服务,访问浏览器,查看redis数据库中数据