基于 Django 类的 post-only 视图
Posted
技术标签:
【中文标题】基于 Django 类的 post-only 视图【英文标题】:Django class based post-only view 【发布时间】:2016-08-19 23:14:20 【问题描述】:对不起,如果这是一个微不足道的问题,但我已经搜索了很长时间,但一直找不到一个好的实现。
谁能提供一个示例,说明如何通过子类化任何通用视图在 Django 中实现仅发布视图(可以处理文件上传)?
我想创建一个端点来处理所有博客文章评论创建逻辑。评论表单嵌入在我的博客页面中,因此,此数据将作为 POST
发送到 url。
【问题讨论】:
【参考方案1】:我想这样的事情应该可行:
class TestView(View):
def post(self, request):
return HttpResponse('This is a post only view')
如果您使用 Django Rest Framework,您也可以使用 CreateAPIView 来执行此操作 http://www.django-rest-framework.org/api-guide/generic-views/#createapiview
用于仅创建端点。
提供一个 post 方法处理程序。
【讨论】:
这假设正在使用 DRF 我猜必须有办法自己做到这一点。我对一切都使用普通视图。对一个特定视图使用 DRF 似乎有点过头了。 @Sayse 是的,它假设使用了 DRF。我已经编辑了答案【参考方案2】:你可以试试这样的:
class MyView(TemplateView):
template_name = 'my_template.html'
def post(self, request, **kwargs):
my_data = request.POST
# do something with your data
context = # set your context
return super(TemplateView, self).render_to_response(context)
【讨论】:
我用它来避免在具有批量功能(删除、存档)的表中使用表单集。更简单、更清洁。【参考方案3】:来自docs:
dispatch 查看请求以确定它是 GET、POST 等,并将请求中继到匹配的方法如果定义了一个,或者引发 HttpResponseNotAllowed
因此,基本上,您创建的任何基于类的视图都只定义了 POST
方法,将只允许 POST 请求。
【讨论】:
【参考方案4】:View
类有一个http_method_names
属性,该属性列出了视图将接受的 HTTP 方法。
因此,您可以对任何您喜欢的通用视图进行子类化(例如,CreateView
),并设置http_method_names
以便只允许 POST 请求。
from django.views.generic.edit import CreateView
class CommentCreateView(CreateView):
http_method_names = ['post']
model = Comment
...
或者,您可以继承 View
,并编写自己的 post 方法。
class CommentView(View):
def post(self, request):
...
在这种情况下,GET 请求将返回 HttpResponseNotAllowed
响应,因为您尚未定义 get
方法来处理 GET 请求。
【讨论】:
【参考方案5】:有一个内置的装饰器:require_POST()
。更一般地,您可以使用require_http_methods()
。
对于基于函数的视图(从文档中复制):
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass
对于基于类的视图:
from django.utils.decorators import method_decorator
from django.views.decorators.http import require_http_methods
@method_decorator(require_http_methods(["GET", "POST"]), name='dispatch')
class MyView(View):
# I can assume now that only GET or POST requests make it this far
# ...
pass
【讨论】:
以上是关于基于 Django 类的 post-only 视图的主要内容,如果未能解决你的问题,请参考以下文章