视图
概述:
- 作用:视图接收web请求,并响应web请求
- 本质:视图就是python中的一个函数
- 响应:
-
响应过程:
用户在浏览器中输入网址www.sunck.wang/sunck/index.html
—网址—>
django获取网址信息,去掉IP与端口号,网址变成:sunck/index.html
—虚拟路径与文件名—>
url管理器逐个匹配urlconf,记录视图函数
—视图函数名—>
视图管理,找到对应的视图去执行,返回结果给浏览器
—响应的数据—>
返回第一步:用户在浏览器中输入网址 -
网页
重定向
错误视图
404视图:找不到网页(url匹配不成功时返回)时返回
在templates目录下定义404.html<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>页面丢失</h1> <h2>{{request_path}}</h2> </body> </html>
request_path:导致错误的网址
配置settings.py
DEBUG
如果为 True,永远不会调用404页面,需要调整为 False 才会显示
ALLOWED_HOSTS = [’*’]
500视图:在视图代码中出现错误(服务器代码错误)
400视图:错误出现在客户的操作
JSON数据
-
url配置
- 配置流程:
制定根级url配置文件
settings.py文件中的ROOT_URLCONF
ROOT_URLCONF = ‘project.urls’
默认实现了
urlpatterns
一个url实例的列表
url对象
正则表达式
视图名称
名称
url匹配正则的注意事项
如果想要从url中获取一个值,需要对正则加小括号
匹配正则前方不需要加’/’
正则前需要加’r’表示字符串不转义 - 引入其他url配置
在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py中使用include方法
project\urls.py:from django.contrib import admin from django.conf.urls import url,include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('myApp.urls', namespace="myAPP")), ] myApp\urls.py from django.urls import path, include from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name="index"), ]
- url的反向解析
概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
解决:在使用链接时,通过url配置的名称,动态生成url地址
作用:使用url模板
{{url ‘web-scope-name’ v1 v2}}
视图函数
定义视图:
本质:一个函数
视图参数:
一个HttpRequest的实例
通过正则表达式获取的参数
位置:一般在views.py文件下定义
HttpRequest对象
-
概述:
服务器接收http请求后,会根据报文创建HttpRequest对象
视图的第一个参数就是HttpRequest对象
django创建的,之后调用视图时传递给视图 -
属性
path:请求的完整路径(不包括域名和端口)
method:表示请求的方式,常用的有GET,POST
encoding:表示浏览器提交的数据的编码方式,一般为utf-8
GET:类似于字典的对象,包含了get请求的所有参数
POST:类似于字典的对象,包含了post请求的所有参数
FILES:类似字典的对象,包含了所有上传的文件
COOKIES:字典,包含所有的cookie
session:类似字典的对象,表示当前会话 -
方法
is_ajax():如果是通过XMLHttpRequest发起的,返回 True ###ajax请求的一般都会json数据 -
QueryDict对象
request对象中的GET,POST都属于QueryDict对象
方法:- get():
根据键获取值,只能获取一个值
www.sunck.wang/abc?a=1&b=2&c=3 - getlist()
将键的值以列表的形式返回
可以获取多个值
www.sunck.wang/abc?a=1&b=2&c=3
- get():
-
GET属性
获取浏览器传递过来数据
get形式:www.mydjango.com/abc?a=1&b=2&c=3
urls.py:url(r'^get1', views.get1), #结尾不能加$,否则无法匹配
def get1(request): a = request.GET.get('a') b = request.GET.get('b') c = request.GET.get('c') return HttpResponse(a + " " + b + " " + c)
get形式:www.mydjango.com/abc?a=1&a=2&c=3
urls.py:url(r'^get2', views.get2),
def get2(request): a = request.GET.getlist('a') a1 = a[0] a2 = a[1] c = request.GET.get('c') return HttpResponse(a1 + " " + a2 + " " + c)
-
POST属性
- 使用表单模拟POST请求
关闭CSRF:project\project\settings.py
延伸:CSRF:Cross Site Request Forgery, 跨站点伪造请求—是一种安全防御机制,在站点中防止他人利用cookie和伪造链接达成通话的一种验证方式,在中间件(middleware)关闭CSRF验证是一种方式,但是这不安全,另外一种解决方式是在网页中加入csrf_token标签::{% csrf_token %}
示例: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', ]
def showregist(request): return render(request, 'myApp/regist.html',) def regist(request): name = request.POST.get("name") gender = request.POST.get("gender") age = request.POST.get("age") hobby = request.POST.getlist("hobby") print(name) print(gender) print(age) print(hobby) return HttpResponse("regist")
- 路径:
url(r'^showregist/$', views.showregist), url(r'^showregist/regist/$', views.regist),
- 页面:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>注册</title> </head> <body> <form action="regist/" method="post"> 姓名:<input type="text" name="name" value=""/> <hr> 性别:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女 <hr> 爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla <hr> <input type="submit" value="注册"> </form> </body> </html>
- 使用表单模拟POST请求
HttpResponse对象
- 概述:
作用:给浏览器返回数据
HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建 - 用法:
不用模板,直接返回数据
语句示例:return HttpResponse(“Sunck is a good man”)
调用模板
使用render方法
原型:render(request, templateName[, context])
作用:结合数据和模板,返回一个完整的HTML页面
参数:
request:请求体对象
templateName:模板路径
context:传递给需要渲染在模板上的数据,字典dict类型 - 属性
content:表示返回内容
charset:编码格式
status_code:响应状态码
200
304
404
400
content-type:指定输出的MIME类型 - 方法
-
init:使用页面内容实例化HttpResponse对象
-
write(content):以文件的形式写入
-
flush():以文件的形式输出缓冲区
-
set_cookie(key, value, maxAge=None, exprise=None):设置cookie
-
delete_cookie(key):删除cookie
如果删除一个不存在的cookie,就当什么都没发生
-
- 子类HttpResponseRedirect
功能:重定向,服务器端的跳转
简写:redirect(to)
to推荐使用反向解析
示例:from django.http import HttpResponseRedirect from django.shortcuts import redirect def redirect1(request): # return HttpResponseRedirect('/redirect2') return redirect('/redirect2') def redirect2(request): return HttpResponse("我是重定向后的视图")
- 子类JsonResponse
返回Json数据,一般用于异步请求----ajax异步请求
init(self.data)
data 字典
注意:Content-type类型为application/json
状态保持
-
概论
http协议是无状态的,每次请求都是一次新的请求,它不记得之前的请求。客户端与服务器的一次通信就是一次会话实现状态的保持,在客户端或服务端存储有关会话的数据。
存储的方式- cookie:所有数据存储在客户端,不要存储敏感的数据
- session:所有的数据存储在服务端,在客户端用cookie存储session_id
状态保持的目的:
在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
注意:不同的请求者之间不会共享这个数据,与请求者一一对应 -
启用session:
project\project\settings.py中添加:INSTALLED_APPS 'django.contrib.sessions', MIDDLEWARE 'django.contrib.sessions.middleware.SessionMiddleware',
-
使用session
启用session后,每个httpRequest对象都有一个session属性
获取:get[key, default=None] 根据键获取session值
清除:-
from django.contrib.auth import logout
logout(session) ###推荐使用 -
clear() 清空所有会话
-
flush() 删除当前会话并删除会话的cookie
示例:
# session def main(request): # 取session username = request.session.get('name', '游客') print(username) return render(request, 'myApp/main.html', {'username': username}) def login(request): return render(request, 'myApp/login.html') def showmain(request): print("*****************") username = request.POST.get('username') # 存储session request.session['name'] = username return redirect('/main/') from django.contrib.auth import logout def quit(request): # 清除session logout(request) # 方法1,推荐 # request.session.clear() # 方法2 request.session.flush() # 方法3 return redirect('/main/')
-
-
设置session过期时间
set_expiry(value)
request.session.set_expiry(10) 设置为10秒后过期
如果不设置,2个星期后过期
value设置为0代表关闭浏览器时过期
value设置为None代表设置永不过期,不推荐