1 forms局部和全局钩子的源码
-is_valid---》self.errors--->self.full_clean()-->
self._clean_fields()
1 cbv加装饰器
总结:
1-cbv加装饰器可以加在类上:
@method_decorator(auth,name='post')
def auth(func):
def inner(request,*args, **kwargs):
2 正向代理和反向代理
https://www.cnblogs.com/liuqingzheng/p/10521675.html
3 中间件介绍和常用内置中间件
0 中间件:数据库中间件(mycat,分库分表),服务器中间件(tomcat,nginx),消息队列中间件(rabbitmq)
1 django中间件(Middleware):介于request与response处理之间的一道处理过程,在全局上改变django的输入与输出
3.1 django在内置中间件
MIDDLEWARE = [
4 自定义中间件
4.1 process_request(重点)
1 请求来了触发它,从上往下依次执行(在setting中中间件注册的位置)
def process_request(self, request):
如果返回None,就继续往下走
如果返回四件套之一,直接就回去了
2 在这里面写请求来了的一些判断
3 request.META.REMOTE_ADDR
4.2 process_response(重点)
1 请求走了,会触发它,从下往上执行
def process_response(self, request, response):
print('请求走了0000')
return response
4.3 process_view(了解)
Django会在调用视图函数之前调用process_view方法。
它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果
def process_view(self, request, view_func, view_args, view_kwargs):
# view_func 视图函数
# view_args, 位置参数
# view_kwargs 关键字参数
print('我是process view')
# 如果return None,会执行执行视图函数
#手动执行了视图函数
# response=view_func(request,view_args, view_kwargs)
# 返回response,视图函数就不执行了
return HttpResponse('ddddd')
4.4 process_exception(了解)
这个方法只有在视图函数中出现异常了才执行
def process_exception(self, request, exception):
#记录错误日志
print(exception)
print('出错了')
4.5 process_template_response(了解)
该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
def process_template_response(self,request,response):
print('我执行了')
return response
class Test:
def __init__(self,status,msg):
self.status=status
self.msg=msg
def render(self):
import json
dic={'status':self.status,'msg':self.msg}
return HttpResponse(json.dumps(dic))
def index(response):
return Test(True,'测试')
5 CSRF_TOKEN跨站请求伪造
https://www.cnblogs.com/liuqingzheng/p/9505044.html
1 CSRF或者XSRF:跨站请求伪造
2 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
3 防范:CSRF攻击防范
-Referer:上一次访问的地址(图片防盗链)
https://www.lagou.com/gongsi/
-在请求地址中添加 token 并验证
-在 HTTP 头中自定义属性并验证
-把随机字符串放在请求体中
6 django中处理csrf
1 中间件不要注释了
2 如果是form表单
<form action="" method="post">
{% csrf_token %}
<p>给谁转:<input type="text" name="to_user" id="id_name"></p>
<p>转多少:<input type="text" name="money" id="id_money"></p>
<input type="submit" value="转账">
</form>
3 如果是ajax提交:两种方案
$.ajax({
url: '/transfer/',
method: 'post',
//data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()},
data: {to_user: $('#id_name').val(), money: $('#id_money').val(),csrfmiddlewaretoken:'{{csrf_token}}'},
success: function (data) {
console.log(data)
}
})
6.1 cookie的处理
<script src="/static/jquery.cookie.js"></script>
var token=$.cookie('csrftoken')
6.2 csrf放到请求头中
$.ajax({
url: '',
headers:{'X-CSRFToken':token},
type: 'post',
data: {
'name': $('[name="name"]').val(),
'password': $("#pwd").val(),
},
success: function (data) {
console.log(data)
}
})
6.1 全局使用csrf,局部视图函数禁用csrf
1 在视图函数上加装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 不再检测,局部禁用(前提是全站使用)
# @csrf_exempt
# 检测,局部使用(前提是全站禁用)
@csrf_protect
def csrf_token(request):