1.中间件
https://www.cnblogs.com/maple-shaw/articles/9333824.html
1. Django的请求的生命周期
2. 中间件的五种方法
process_request(self,request)
1. 执行时间
在视图函数执行之前
2. 参数
request :请求对象 和视图的参数是一个
3. 执行顺序
按照注册的顺序 顺序执行
4. 返回值
None : 正常流程
response对象: 正常流程后的process_request方法、视图都不执行,执行执行当前中间件的process_response,
response对象返回给浏览器
process_response(self, request, response)
1. 执行时间
在视图函数执行之后
2. 参数
request :请求对象 和视图的参数是一个
response : 视图返回的响应对象
3. 执行顺序
按照注册的顺序 倒叙执行
4. 返回值
response对象:必须返回
process_view(self, request, view_func, view_args, view_kwargs)
1. 执行时间
在视图函数执行之前,在process_request之后,在路由匹配之后
2. 参数
request :请求对象 和视图的参数是一个
view_func:视图函数
view_args:视图函数的位置参数
view_kwargs:视图函数的关键字参数
3. 执行顺序
按照注册的顺序 顺序执行
4. 返回值
None : 正常流程
response对象: 之后中间的process_view方法、视图不执行,执行所有中间的process_response
process_template_response(self,request,response)
1. 执行时间
触发条件: 视图返回响应对象有一个render方法
时间: 在视图执行之后
2. 参数
request :请求对象 和视图的参数是一个
response : 视图返回的响应对象
3. 执行顺序
按照注册的顺序 倒叙执行
4. 返回值
response对象: 必须的
process_exception(self, request, exception)
1. 执行时间
触发条件: 视图层面有错误之后执行
2. 参数:
request :请求对象 和视图的参数是一个
exception: 错误对象
3. 执行顺序
按照注册的顺序 倒叙执行
4. 返回值
None: 正常报错
response对象:之后的中间件process_exception方法不执行,执行所有中间件的process_response
3. csrf中间件源码分析
from django.views.decorators.csrf import csrf_exempt,csrf_protect
2. ajax
https://www.cnblogs.com/maple-shaw/articles/9524153.html
1. 发请求的途径
1. 在浏览器地址上输入地址 回车 ——》 GET
2. form表单 ——》 GET / POST
3. a标签 ——》 GET
2. ajax
使用js技术发送异步请求 一般传输json数据
特点:
局部刷新 当前页面不刷新
异步
1. 计算示例
$.ajax({
url:'/calc1/',
type:'post',
data:{
i1:$('[name="ii1"]').val(),
i2:$('[name="ii2"]').val()
},
success:function (res) {
console.log(res);
$('[name="ii3"]').val(res)
}
})
2. ajax的参数介绍
上传文件
form_obj = new FormData();
form_obj.append('f1', $('#f1')[0].files[0]);
$.ajax({
url: '/upload/',
type: 'post',
processData: false, # 告诉ajax不处理编码方式
contentType: false, # 告诉ajax不处理contentType
data: form_obj,
success: function (res) {
console.log(res); # 返回的响应的响应体
},
})
3. 提交post请求的设置
前提有cookie csrftoken
1.
使用 {% csrf_token %}
data: {
i1: $('[name="i1"]').val(),
i2: $('[name="i2"]').val(),
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
},
2.
headers:{'X-csrftoken':$('[name="csrfmiddlewaretoken"]').val()},
3. 使用文件
3. form组件
https://www.cnblogs.com/maple-shaw/articles/9537309.html
1. 注册示例
2. form组件的使用
1. 定义
# 注册form
class RegForm(forms.Form):
user = forms.CharField(label='用户名')
pwd = forms.CharField(label='密码',widget=forms.widgets.PasswordInput)
2. 使用
1. 视图中
form_obj = RegForm()
form_obj = RegForm(request.POST)
form_obj.is_valid 布尔值
2. 模板中
{{ form_obj.as_p }} —— 》 生成P标签 (label 和 input)
{{ form_obj.user }} —— 》 生成input框
{{ form_obj.pwd }}
{{ form_obj.pwd.label }} ——》 对应的中文
{{ form_obj.pwd.id_for_label }} ——》 input的ID
{{ form_obj.errors }} —— 》 所有错误提示
{{ form_obj.pwd.errors }} —— 》 某个字段的所有错误提示
{{ form_obj.pwd.errors.0 }} —— 》 某个字段的第一错误提示
3. 字段及参数介绍
见博客
min_length=8,
max_length=16,
label='用户名',
initial='alex',
widget=forms.widgets.Input(attrs={'class': 'form-control'}),
error_messages=
4. 内置校验器和自定义检验
1. 内置的校验
min_length=8,
max_length=16,
required
2. 自定义校验
1. 提供校验的类
from django.core.validators import RegexValidator
2. 函数
from django.core.exceptions import ValidationError
def check_name(value):
if 'alex' in value:
raise ValidationError('涉黄')
5. is_valid源码解析及局部、全局钩子
1. 局部钩子
校验某个字段
def clean_pwd(self):
value =self.cleaned_data.get('pwd')
if len(value)<6:
raise ValidationError('密码少于6位')
return value
2. 全局钩子
def clean(self):
pwd = self.cleaned_data.get('pwd')
re_pwd = self.cleaned_data.get('re_pwd')
if pwd == re_pwd:
return self.cleaned_data
self.add_error('re_pwd','两次密码不一致')
raise ValidationError('两次密码不一致')
4. auth模块
https://www.cnblogs.com/maple-shaw/articles/9537320.html
1. 登录
1. auth.authenticate 验证用户名和密码
obj = auth.authenticate(request, username=user, password=pwd)
2. login(request,user) 保存登录状态 写session
3. login_required 登录之后才能访问某个页面
from django.contrib.auth.decorators import login_required
4. request.user.is_authenticated() 判断登录状态
2. 注销
3. 注册
4. 扩展auth表