------------- 视图------------
概述:
作用:视图接受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 admin from django.urls import path,re_path,include urlpatterns = [ 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.html request_path : 导致错误的网址 2.配置settings.py DEBUG = False #如果为true永远不会调用404页面 ALLOWED_HOSTS = ['*'] #允许所有人访问
HTTPRequest对象:(获取浏览器传给服务器的数据)
-
概述:
1.服务器接受http请求后会根据报文(数据流)创建HTTPRequest对象,传递给 视图的第一个参数就是HTTPRequest 2.django创建的,之后调用视图时传递给视图
-
属性:
path:请求的完整路径(不包括域名和端口) method:表示请求得方式,常用的:GET \ POST encoding:表示浏览器提交的数据编码方式,一般为utf-8 GET: 类似字典的对象,包含了get请求的所有参数 POST:类似字典的对象,包含了post请求的所有参数 FILSE:类似字典的对象,包含了所有上传的文件 COOKIES:字典,包含所有的cookie session:类似字典的对象,表示当前的会话
-
方法:
is_ajax() 如果是通过XMLHttpRequest发起的,返回True
-
QueryDict对象:
request中的GET,POST都属于QueryDict对象 方法: 1.get() 作用:根据键获取值。只能获取一个值 www.luciano.wang/abc?a=1&b=2 2.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 HttpResponseRedirect from django.shortcuts import redirect def 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值 删除session 1.clear() 清空所有的会话 2.flush() 删除当前的会话,并删除会话的cookie 3.from django.contrib.auth import logout logout(request)
-
实例
#获取浏览器form表单中标签name属性为username的值
username = request.POST.get('username')
#存储session
request.session['name']=username
#取session
username = 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缓存session
settings.py添加如下:
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT= 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'