Django @csrf_exempt不适用于基于通用视图的类(Django @csrf_exempt does not work on generic view based class)
class ChromeLoginView(View):
def get(self, request):
return JsonResponse({'status': request.user.is_authenticated()})
@method_decorator(csrf_exempt)
def post(self, request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return JsonResponse({'status': True})
return JsonResponse({'status': False})
我期待帖子确实由csrf停止,但它返回403错误。
但是如果删除那个装饰器并在URLConf中执行此操作
url(r'^chrome_login/', csrf_exempt(ChromeLoginView.as_view()), name='chrome_login'),
它会工作。
这里发生了什么?它不应该工作,因为我猜这就是method_decorator所做的。我正在使用python3.4和django1.7.1,任何建议都会很棒。
你需要装饰dispatch方法csrf_exempt才能工作。它的作用是csrf_exempt在视图函数本身上设置一个属性True,中间件在(最外层)视图函数上检查它。如果只需要修饰一些方法,你仍然需要csrf_exempt在dispatch方法上使用,但你可以使用csrf_protect例如put()。如果GET,HEAD,OPTIONS或TRACEHTTP方法用于不管你装饰与否也不会被选中。
class ChromeLoginView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(ChromeLoginView, self).dispatch(request, *args, **kwargs) def get(self, request):
return JsonResponse({'status': request.user.is_authenticated()}) def post(self, request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return JsonResponse({'status': True})
return JsonResponse({'status': False})
正如@knbk所说,这是dispatch()必须装饰的方法。
从Django 1.9开始,您可以method_decorator直接在类上使用:
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch')
class ChromeLoginView(View): def get(self, request):
return JsonResponse({'status': request.user.is_authenticated()}) def post(self, request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return JsonResponse({'status': True})
return JsonResponse({'status': False})
这避免了重写dispatch()方法只是为了装饰它。
如果您正在寻找符合您需求的Mixins,那么您可以创建一个CSRFExemptMixin并在您的视图中扩展它,无需在每个视图中编写上述语句:
class CSRFExemptMixin(object):
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(CSRFExemptMixin, self).dispatch(*args, **kwargs)
之后在你的视图中扩展这个。
class ChromeLoginView(CSRFExemptMixin, View):
您可以根据您的要求在任何视图中扩展它,这是可重用性!:-)
干杯!
Django @csrf_exempt不适用于基于通用视图的类(Django @csrf_exempt does not work on generic view based class)的更多相关文章
- Django:之Sitemap站点地图、通用视图和上下文渲染器
Django中自带了sitemap框架,用来生成xml文件 Django sitemap演示: sitemap很重要,可以用来通知搜索引擎页面的地址,页面的重要性,帮助站点得到比较好的收录. 开启si ...
- Django 1.10中文文档-第一个应用Part4-表单和通用视图
本教程接Part3开始.继续网页投票应用程序,并将重点介绍简单的表单处理和精简代码. 一个简单表单 更新一下在上一个教程中编写的投票详细页面的模板polls/detail.html,让它包含一个HTM ...
- Django通用视图执行过程
使用通用视图后,Django请求处理过程(以ListView为例):在我们自定义的视图中: class IndexView(ListView): template_name = 'blog/index ...
- Django 基于类的通用视图
在早期,我们认识到在视图开发过程中有共同的用法和模式.这时我们引入基于函数的通用视图来抽象这些模式以简化常见情形的视图开发. 基于函数视图的用法有以下三种: def index(request): r ...
- Django 1.6 基于类的通用视图
Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...
- Django的rest_framework的视图之基于通用类编写视图源码解析
我们上一篇博客讲解了如何使用mixins类实现rest_framework的视图,但是其中有很多的冗余的代码,我们这边在来优化一下 1.queryset的视图函数 首先看下对queryset操作的视图 ...
- Django——django1.6 基于类的通用视图
最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特定的参数集即可,不必关心具体的实现.各种 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...
- Django的rest_framework的视图之基于ModelViewSet视图源码解析
前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...
随机推荐
- 查看SSL证书的别名
1.把java目录下的keytool拷贝到证书目录下:2.进入证书目录,然后输入命令keytool -list -v -keystore file.jks -storepass password,发现 ...
- ef复杂模型添加
模型浏览器 函数导入-添加存储过程名称 添加复杂实体.复杂实体可以手动在xml里面创建.在complextype里面
- html article标签 语法
html article标签 语法 article标签有什么作用?直线电机生产厂家 作用:html中article标签的作用是规定独立的自包含内容,其中外部内容是来自一个外部的新闻提供者的一篇新文章, ...
- 2019hdu多校 AND Minimum Spanning Tree
题目链接:Click here 题目大意:两个点之间的边权为编号按位与的值,求最小生成树,方案要字典序最小 Solution: 一道不难的构造题,每个点连向他取反后的lowbit值,这样边权为0,若l ...
- 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.
由于 request中getReader()和getInputStream()只能调用一次 在项目中,可能会出现需要针对接口参数进行校验等问题. 因此,针对这问题,给出一下解决方案 实现方法:先将Re ...
- es6的class关键字与es5的构造函数
1,构造函数 function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function () { ret ...
- Vue.use源码分析(转)+如何封装一个组件
封装一个组件:https://www.jianshu.com/p/89a05706917a 我想有过vue开发经验的,对于vue.use并不陌生.当使用vue-resource或vue-router等 ...
- Mybatis 中在xxx.mapper书写模糊查询
1.在mybatis中,书写sql,有时候会有一些不细心,如: <!-- 首页商品 关键字搜索--> <select id="getGoodsByLikeTitle&quo ...
- centos7 yum安装jdk
安装之前先检查一下系统有没有自带open-jdk 命令: rpm -qa |grep java rpm -qa |grep jdk rpm -qa |grep gcj 如果没有输入信息表示没有安装. ...
- 清理docker 容器下面的log
1. docker info 找到docker root dir 2. go to /var/lib/docker 3. constainers 下面有每个容器的文件夹,-json.log 结尾的为L ...