视图(Views)
作用:接收web请求,并响应web请求。
本质:就是python中的函数。
响应内容:①网页、重定向、错误视图(404,500)②json数据
响应过程:
1、用户在浏览器输入网址
2、django获取网址信息,去除IP和端口号
3、url管理器逐个匹配url conf
4、若匹配成功,则执行对应的视图函数
5、视图管理器找到对应视图并执行,返回结果给浏览器
url配置
流程:
1、指定根级url文件(settings.py中设置。)
# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.11/howto/static-files/STATIC_URL = \'/static/\'
2、project/urls.py中的urlpatterns中是一个url实例的列表。
每个对象都包括 正则表达式、视图名称和namespace。
3、引入其他url配置文件,在project/urls.py中使用include方法
from myapp import urlsurlpatterns = [url(r\'^admin/\', admin.site.urls),url(r\'^chendw/\', include(\'myapp.urls\', namespace=\"myapp\"))]
url配置正则需注意
1、若要从url中获取值,则需要对正则加小括号
url(r\'^(\\d+)/$\', views.detail), # 正则表达式
2、匹配正则前方不需要加 ‘/’反斜杠
3、正则前需要加‘r’,表示字符串不转义
视图函数
定义试图(本质为函数)
参数:
第一个,HttpRequest的对象实例
第二个,通过正则表达式获取
def detail(request, num):return HttpResponse(\"detail -%s\" %num)
位置:
一般在views.py中定义
错误视图:
500 在视图代码中出错
400 错误出现在客户的操作
404 找不到网页(url匹配失败)
以上错误视图均可自己定义,在template目录下定义,并在settings.py中进行配置。(注释掉默认的错误视图)
MIDDLEWARE = [\'django.middleware.security.SecurityMiddleware\',\'django.contrib.sessions.middleware.SessionMiddleware\',\'django.middleware.common.CommonMiddleware\',# \'django.middleware.csrf.CsrfViewMiddleware\',\'django.contrib.auth.middleware.AuthenticationMiddleware\',\'django.contrib.messages.middleware.MessageMiddleware\',\'django.middleware.clickjacking.XFrameOptionsMiddleware\',]
HttpRequest对象(由django创建)
服务器接受http请求后,会根据报文创建HttpRequest对象,视图函数中第一个参数就是HttpRequest对象。
对象属性
属性 | 内容 |
---|---|
path | 请求的完整路径 |
method | 请求的方式,如GET,POST |
encoding | 编码方式 |
GET | 类似字典对象,包含了get对象的各个参数 |
POST | 类似字典对象,包含了post对象的各个参数 |
FILES | 类似字典对象,包含上传文件参数 |
COOKIES | 类似字典对象,包含了所有cookies |
session | 表示当前会话 |
HttpResponse对象(由程序员创建)
用于给浏览器返回数据
用法:
1、不调用模板,直接返回数据
def index(request):return HttpResponse(\"chendw is good man\")
2、调用模板,使用render()方法渲染
def grades(request):# 去模板里取数据grades_list = Grades.objects.all()# 将数据传给模板return render(request, \'myapp/grades.html\', {\"grades\": grades_list})
render()方法
原型: render(request,template,{context})
作用:结合数据和模板,返回完整html页面
对象属性
属性 | 内容 |
---|---|
content | 表示返回完整地内容 |
charset | 编码格式 |
status-code | 响应状态码 |
content-type | 指定输出MIME类型 |
方法
方法 | 功能 |
---|---|
init | 使用页面内容实例化HttpResponse对象 |
write(content) | 以文件形式输入 |
flush() | 以文件形式输出缓冲区 |
set_cookie(key,value,max_age,expires) | 设置cookie |
delete_cookie(key) | 删除cookie |
子类
HttpResponseRedirect 重定向,服务器跳转
from django.http import HttpResponseRedirect# redirectdef redirecttest1(request):return HttpResponseRedirect(\'/chendw/redirect2\')
Session状态保持
概述:
Http协议是无状态的,每次请求都是新的请求。
服务器与客户端的一次通信,就是一个新的会话。
实现状态保持,由客户端或服务器存储。
存储方式包括:cookie或session。
目的:
在一段时间内跟踪请求者的状态,可以实现跨页面访问请求者数据,但不同请求者直接的数据不共享。
启用
settings.py文件中的INSTALLED_APP和MIDDLEWARE字段中配置。
INSTALLED_APPS = [\'django.contrib.sessions\',]MIDDLEWARE = [\'django.contrib.sessions.middleware.SessionMiddleware\',]
使用
每个HttpRequest对象都有一个session属性,是一个类似字典的对象。通过调用session对象进行调用。
def main(request):username = request.session.get(\'name\', \"游客\")return render(request, \'myapp/main.html\',{\'name\': username})def login(request):return render(request,\'myapp/login.html\')def showmain(request):username = request.POST.get(\'username\')request.session[\'name\'] = usernamerequest.session.set_expiry(10)return redirect(\'/chendw/main/\')from django.contrib.auth import logoutdef quit(request):# logout(requestrequest.session.clear()return redirect(\'/chendw/main\')
设置过期时间
request.session.set_expiry(10)
若不设置,则默认两周后过期。
参数可选:
参数 | 效果 |
---|---|
None | 永不过期 |
整数 | 秒 |
时间对象 | 指定日期过期 |
0 | 关闭浏览器过期 |
存储session的位置
1、默认为数据库存储session
# 数据库保存sessionSESSION_ENGINE = \'django.contrib.session.backends.db\'
2、使用缓存保存session,只保存在内存中,若丢失则无法恢复,但相比数据库访问速度较快。
# 缓存保存sessionSESSION_ENGINE = \'django.contrib.session.backends.cache\'
3、数据库和缓存并用保存session,优先读取缓存,若无则寻找数据库。
# 缓存和数据库保存sessionSESSION_ENGINE = \'django.contrib.session.backends.cached_db\'