问csrftoken在Django里面是基于什么实现的?------>中间件。django
若是是Django表示每次发请求过来的时候,要检验有没有带随机字符串。当在执行视图函数以前,前面还有一道屏障,这个屏障就是用来判断带没带这个随机字符串,带了就能够继续往下走,没带就直接让它返回。根本到不了要请求的那里。json
csrftoken在view方法里面。为何呢?(中间件里作判断,若是加了免除csrf免除认证装饰器,它得作个判断得找到那个函数找到它上面的那个装饰器。而对于process_view而言,根本没到达路由匹配根本没找到函数,只有到process_view以后才能找到函数才能作判断。)cookie
发过来请求,拿到token,验证这个token是否是我以前发的,若是带了就让继续执行,没带就直接返回。 函数
加这个装饰器,意味着这个函数免除csrtoken认证。post
from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
来作csrftoken认证的时候作两件事(process_view作的):网站
第一件事先判断加没加这个装饰器spa
第二件事获取请求过来的token(请求体或cookie中)并进行验证是否遵循csrftoken规则,若是验证经过则继续执行,若是验证不经过则返回。code
Django最多能够写几个方法?csrf
process_request中间件
process_response
process_view
process_exception (异常以后执行)
process_render_template (这个返回的对象视图函数永远不执行,由于没有render方法。)
中间件的执行流程是什么样子的?
看Django版本。
Django1.10 以上版本。
请求进来先执行Django中间件全部的request,执行路由匹配,意味着找到函数,但不执行。
跳回来在执行view,都执行完,执行视图函数。
视图函数在执行response再返回。
若是报错exception执行。
若是返回的对象有render方法,render_tempate方法也会被执行。
中间件作过什么?
权限
用户登陆认证(以前是在每一个视图函数以前加装饰器)为了省事不须要再每一个函数加装饰器了,只要在中间件作一次判断就能够了。
csrftoken
若是不注释 'django.middleware.csrf.CsrfViewMiddleware', 意味着全局全栈整个网站只要发指定请求都是遵循csrftoken的要求。
不想要csrftoken认证的时候能够给他加个装饰器。
from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
还能够中间件注视了都不用,可是就想让他用怎么办?也是加个装饰器
rom django.views.decorators.csrf import csrf_protect # Create your views here. @csrf_protect def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
对csrft如今有两种设置方式了,一种是中间件,一种是装饰器。
若是cbv里面不想用csrftoken怎么办?
若是在cbv加装饰器导入
from django.utils.decorators import method_decorator
把@method_decorator(csrf_exempt)这个装饰器,并把csrf_exempt当作参数传进来。
到dispatch中就能够了。免除csrftoken认证。
class StudentsView(MyBaseView,View): @method_decorator(csrf_exempt) def dispatch(self, request,*args, **kwargs): print('before') ret = super(StudentsView, self).dispatch(request, *args, **kwargs) print('after') return ret def get(self, request, *args, **kwargs): print('get方法') return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
还有一种dispatch方法不用写,加到类里面去。这样也能够。
@method_decorator(csrf_exempt,name='dispatch') #name是里面的方法名。 找到这个对象StudentsView的dispatch这个方法并给这个方法加上装饰器。
class StudentsView(View):
def get(self, request, *args, **kwargs):
print('get方法')
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')