csrf_toekn认证机制:
django中对POST请求,csrf会进行认证处理,csrf认证机制是防御跨站伪造功能,在没有任何处理的前提下,POST请求会报错。csrf认证中间件是在process_view执行(通过装饰器强制认证或者放行可知,并不是走process_request中间件。),同时对类中的方法进行CSRF装饰器操作需要:
# 注意:FBV只能添加在dispatch方法上(或者装饰在类上指定dispatch方法),类中单独方法无效。
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
FBV(function+base+view):在视图里使用函数处理请求。
CBV(clalss+base+view):在视图里使用类处理请求。
CBV优点:
提到代码复用性与灵活性,避免冗余代码
引入面向对象技术,可读性高,可继承
不同的请求函数可以针对不同的HTTP请求
案例:
FBV:
# 导入csrf_exempt, csrf_protect
from django.shortcuts import render, HttpResponse
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt # FBV不做csrf_toke认证 反之:@csrf_protect
def users(request):
return HttpResponse('FBV')
CBV:
from django.views import View
# 导入csrf_exempt, csrf_protect,method_decorator
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt, name='dispatch') # 方法1:CBV不做csrf_token验证(单独添加无效方法无效);反之:@csrf_protect。
class StudentsView(View):
@method_decorator(csrf_exempt) # 方法2:CBV不做csrf_token验证(单独方法无效);反之:@csrf_protect。
def dispatch(self, request, *args, **kwargs):
return super(StudentsView, self).dispatch(request, *args, **kwargs)
# 根据请求方式不同,处理不同逻辑。
def get(self, request, *args, **kwargs):
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')
def delete(self, rquest, *args, **kwargs):
return HttpResponse('DELETE')
def put(self, request, *args, **kwargs):
return HttpResponse('PUT')
模板文件:
post请求(get不需要):form下添加 {% csrf_token %}
<form method='POST'>
{% csrf_token %}
<div>...<div>
</form>
AJAX:
方法很多种,大家可以参考。
转载:Django 使用 ajax 和通过 csrf 认证的三种方式