知识点概要
- Session
- CSRF
- Model操作
- Form验证(ModelForm)
- 中间件
- 缓存
- 信号
一、 Session
基于Cookie做用户验证时:敏感信息不适合放在cookie中
a. Session原理
Cookie是保存在用户浏览器端的键值对
Session是保存在服务器端的键值对
b. Cookie和Session对比
c. Session配置(缺少cache)
d. 示例:实现两周自动登陆
- request.session.set_expiry(60*60*24*14)
- SESSION_SAVE_EVERY_REQUEST = True
PS: cookie中不设置超时时间,则表示关闭浏览器自动清除
- session依赖于cookie
- 服务器session
request.session.get()
request.session[x] = x
request.session.clear()
- 配置文件中设置默认操作(通用配置):
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
# set_cookie('k',123)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
- 引擎的配置
二、 CSRF
a. CSRF原理
b. 无CSRF时存在隐患
c. Form提交(CSRF)
d. Ajax提交(CSRF)
CSRF请求头 X-CSRFToken
三、 Model操作
a. 字段类型 + 参数
b. 连表字段 + 参数
c. Meta
d. SQL操作:
- 基本增删改查
- 进阶操作
- 正反查询
- 其他操作
e. 验证(弱)
四、 Form操作
完成:
- 验证用户请求
- 生成HTML
(保留上一次提交的数据)
自定义:
- 类
- 字段(校验)
- 插件(生成HTML)
初始化操作:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/fm/" method="POST"> {% csrf_token %} <p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }}</p> <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p> <p>{{ obj.email }}{{ obj.errors.email.0 }}</p> <p>{{ obj.f }}{{ obj.errors.f.0 }}</p> {{ obj.city1 }} {{ obj.city2 }} <input type="submit" value="提交" /> </form> </body> </html>
from django.shortcuts import render,redirect,HttpResponse from django import forms from django.forms import widgets from django.forms import fields class FM(forms.Form): # 字段本身只做验证 user = fields.CharField( error_messages={'required': '用户名不能为空.'}, widget=widgets.Textarea(attrs={'class': 'c1'}), label="用户名", ) pwd = fields.CharField( max_length=12, min_length=6, error_messages={'required': '密码不能为空.', 'min_length': '密码长度不能小于6', "max_length": '密码长度不能大于12'}, widget=widgets.PasswordInput(attrs={'class': 'c2'}) ) email = fields.EmailField(error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"}) f = fields.FileField() # p = fields.FilePathField(path='app01') city1 = fields.ChoiceField( choices=[(0,'上海'),(1,'广州'),(2,'东莞')] ) city2 = fields.MultipleChoiceField( choices=[(0,'上海'),(1,'广州'),(2,'东莞')] ) from app01 import models def fm(request): if request.method == "GET": # 从数据库中吧数据获取到 dic = { "user": 'r1', 'pwd': '123123', 'email': 'sdfsd', 'city1': 1, 'city2': [1,2] } obj = FM(initial=dic) return render(request,'fm.html',{'obj': obj}) elif request.method == "POST": # 获取用户所有数据 # 每条数据请求的验证 # 成功:获取所有的正确的信息 # 失败:显示错误信息 obj = FM(request.POST) r1 = obj.is_valid() if r1: # obj.cleaned_data models.UserInf.objects.create(**obj.cleaned_data) else: # ErrorDict # print(obj.errors.as_json()) # print(obj.errors['user'][0]) return render(request,'fm.html', {'obj': obj}) return render(request,'fm.html')
五、中间件
1、中间件创建
(1)创建一目录Middle下创建一py文件
(2)配置文件中添加中间件
2、中间件生命周期
(1)正常流程
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Row1(MiddlewareMixin): def process_request(self,request): print('第一层第一列') #注意下面的request和response的顺序 def process_response(self, request,response): print('第一层第二列') return response class Row2(MiddlewareMixin): def process_request(self,request): print('第二层第一列') #如果到这里请求直接返回的话,10版的会直接从同一层response返回 #10版以前的会到最后一个中间键开始返回response # return HttpResponse('请求截胡') def process_response(self, request, response): print('第二层第二列') return response class Row3(MiddlewareMixin): def process_request(self,request): print('第三层第一列') def process_response(self, request, response): print('第三层第二列') return response
效果图
(2)提前截胡,在同一层的request直接响应请求,不会往下一层走了
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Row1(MiddlewareMixin): def process_request(self,request): print('第一层第一列') #注意下面的request和response的顺序 def process_response(self, request,response): print('第一层第二列') return response class Row2(MiddlewareMixin): def process_request(self,request): print('第二层第一列') #如果到这里请求直接返回的话,10版的会直接从同一层response返回 #10版以前的会到最后一个中间键开始返回response return HttpResponse('请求截胡') def process_response(self, request, response): print('第二层第二列') return response class Row3(MiddlewareMixin): def process_request(self,request): print('第三层第一列') def process_response(self, request, response): print('第三层第二列') return response
效果图
总结:
也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
六、 缓存
5种配置
3种应用:
全局
视图函数
模板
七、 信号
- 内置信号
- 自定义
- 定义信号
- 出发信号
- 信号中注册函数