基于 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 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用基于类的视图

基于 Django 类的视图和通用视图详细信息使用

Django:基于类的视图无法呈现清晰的表单

Django 基于类的视图:覆盖表单名称

Django:在基于类的视图中包含媒体(css/js)

用于创建和更新的基于 Django 类的视图