————- 视图————
概述:
作用:视图接受web请求,并相应web请求
本质:视图就是一个python函数
响应:-网页 -重定向
-错误视图 -404-500-JSON数据过程:用户在浏览器输入网址--【网址】-->django获取网址信息(去除ip和端口)--【虚拟路径与文件名】->url管理器(逐个匹配urlconf配置)记录视图函数名--【视图函数名】->视图管理器(找到对应得视图去执行)返回结果给浏览器
url配置:
-
配置流程:
1.指定根级url配置文件(在settings.py中:ROOT_URLOCONF)默认实现了:ROOT_URLCONF = \'project.urls\'2.urlpatterns :一个url实例得列表即url对象,有3个参数 (正则表达式,视图名称,名称)
-
url匹配正则得注意事项:
1.如果想要重url中获取一个值,需要对正则加小括号2.匹配正则前方不需要加反斜杠“/”3.正则前要加r,表示字符串不转义
-
引入其他url配置
1.在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法from django.contrib import adminfrom django.urls import path,re_path,includeurlpatterns = [path(\'admin/\', admin.site.urls),re_path(r\'^\',include(\'myApp.urls\'))#\"/\"默认自动加上了]2.匹配过程1. re_path(r\'^students/$\',views.students),2. views.py中配置相应得视图函数
-
url的反向解析
概念:如果在视图、模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址在project.urls.py:re_path(r\'^\',include(\'myApp.urls\',namespace=\"myApp\")), #django3.0版本有问题在myApp.urls.py:re_path(r\'^students/$\',views.students,name=\"students\"),思路:在使用链接时,通过url配置的第三个参数:“名称”,动态生成url地址作用:使用Url模板
视图函数:
-
定义视图
本质:一个函数视图参数:request(一个HTTPRequest的示例)通过正则表达式获取的参数位置:一般在views.py文件下定义
-
错误视图:
500视图:在视图代码中出现错误(服务器代码)400视图:错误出现在客户操作中404视图:在找不到网页时返回(url匹配不成功)1.在templates目录下定义404.htmlrequest_path : 导致错误的网址2.配置settings.pyDEBUG = False #如果为true永远不会调用404页面ALLOWED_HOSTS = [\'*\'] #允许所有人访问
HTTPRequest对象:(获取浏览器传给服务器的数据)
-
概述:
1.服务器接受http请求后会根据报文(数据流)创建HTTPRequest对象,传递给视图的第一个参数就是HTTPRequest2.django创建的,之后调用视图时传递给视图
-
属性:
path:请求的完整路径(不包括域名和端口)method:表示请求得方式,常用的:GET \\ POSTencoding:表示浏览器提交的数据编码方式,一般为utf-8GET: 类似字典的对象,包含了get请求的所有参数POST:类似字典的对象,包含了post请求的所有参数FILSE:类似字典的对象,包含了所有上传的文件COOKIES:字典,包含所有的cookiesession:类似字典的对象,表示当前的会话
-
方法:
is_ajax() 如果是通过XMLHttpRequest发起的,返回True
-
QueryDict对象:
request中的GET,POST都属于QueryDict对象方法:1.get() 作用:根据键获取值。只能获取一个值www.luciano.wang/abc?a=1&b=22.getlist() 作用:将键的值以列表的形式返回。可以获取多个值www.luciano.wang/abc?a=1&a=1&b=2
-
GET属性
获取浏览器传递过来给服务器的数据http://127.0.0.1:8000/luciano/get1?a=1&b=2&c=3
def get1(request):a= request.GET.get(\'a\')b = request.GET.get(\'b\')c = request.GET.get(\'c\')return HttpResponse(a+b+c)
http://127.0.0.1:8000/luciano/get2?a=1&a=2&c=3
def get2(request):a = request.GET.getlist(\'a\') #getlist返回的是一个列表a1 = a[0]a2 = a[1]c = request.GET.get(\'c\')return HttpResponse(a1,a2,c)
-
POST属性:
使用表单提交实现post请求
def showregist(request):return render(request,\'myApp/regist.html\')def regist(request):name = request.POST.get(\"sname\") #键值是html中标签的name属性值gender = request.POST.get(\"gender\")age = request.POST.get(\"age\")hobby = request.POST.getlist(\"hobby\")print(name,gender,age,hobby)return HttpResponse(\'adasd\')
- 解决CSRF问题: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\',]
HttpResponse对象:
-
概述:
作用:给浏览器返回数据httprequest对象是django创建的,而httpResponse对象是是由程序员创建返回的用法:-不调用模板,直接返回数据return HttpResponse(\'adasd\')-调用模板使用render()方法原型:render(request,templateName[,context])作用:结合数据和模板返回一个完整的HTML页面参数:request 请求体对象templateName 模板路径context 传递给需要渲染在模板上的数据示例:return render(request,\'myApp/regist.html\')方法:init 使用页面内容示例化httpresponse对象write(content) 以文件的形式写入flush() 以文件的形式输出缓冲区set_cookie(key,value=\"\",max_age=None) 设置cookie示例:res.set_cookie(\"luciano\",\"good\")delete_cookie(key) 删除cookie注意:如果删除一个不存在的key就相当于什么没发生子类HttpResponseRedirect功能:1.重定向,服务器端的跳转简写:redirect(to) to推荐使用反向解析----------------from django.http import HttpResponseRedirectfrom django.shortcuts import redirectdef redirect1(request):# return HttpResponseRedirect(\'/luciano/redirect2\')return redirect(\'/luciano/redirect2\')def redirect2(request):return HttpResponse(\"我是重定向后的视图\")----------------子类JsonResponse返回json数据,一般用于异步请求(ajex)__init__(self,data)data:字典对象注意:content-type类型为application/json
状态保持:
http协议是无状态的,每次请求都是一次新的请求,不记得以前的请求
客户端与服务端的一次通信就是一次通话
实现状态的保持,在客户端或者服务端存储有关会话的数据 -
存储方式:
1.cookie所有的数据都存在客户端,不要存敏感的数据2.session(推荐)所有的数据都存在服务器,在客户端用cookie存储session_id状态保持的目的:在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据注意:不同的请求者之间不会共享这个数据,与请求者是一一对应的
-
启用session
settings.py文件中( 默认启用)
INSTALLED_APPS = [ \'django.contrib.sessions\',]MIDDLEWARE =[ \'django.contrib.sessions.middleware.SessionMiddleware\',]
-
使用session
启动session后每个httpRequest对象都有一个session属性,就是一个类似字典的对象 (request.session)存储session数据:request.session[\'key\']=value方法:获取session值:get(key,default=None) 根据key 获取 session值删除session1.clear() 清空所有的会话2.flush() 删除当前的会话,并删除会话的cookie3.from django.contrib.auth import logoutlogout(request)
-
实例
#获取浏览器form表单中标签name属性为username的值username = request.POST.get(\'username\')#存储sessionrequest.session[\'name\']=username#取sessionusername = request.session.get(\"name\",\"游客\")#清除session 三种方式logout(request)# request.session.flush()# request.session.clear()
设置过期时间(如果不设置两个星期自动失效)set_expiry(value)-整数request.session.set_expiry(10)-时间对象-0 关闭浏览器时失效-None 永不过期存储session的位置数据库:默认存储在数据库中使用redis缓存sessionsettings.py添加如下:SESSION_ENGINE = \'redis_sessions.session\'SESSION_REDIS_HOST = \'localhost\'SESSION_REDIS_PORT= 6379SESSION_REDIS_DB = 0SESSION_REDIS_PASSWORD = \'\'SESSION_REDIS_PREFIX = \'session\'