首页 > 解决方案 > Django:特定请求方法的 URL

问题描述

我正在使用 Django,并且正在使用带有 url 的基于类的视图。因此,在 mu 类中,我有方法:post、和.getputdelete

例子:

class MyClassView(View):
    def get(self, request, id=None):
        return HttpResponse('GET request')

    def post(self, request):
        return HttpResponse('POST request')

    def put(self, request, id):
        return HttpResponse('PUT request')

    def delete(self, request, id):
        return HttpResponse('DELETE request')

所以在我的网址中,我有类似的东西:

from django.urls import path
from . import views

urlpatterns =[
    path('my-class/', views.MyClassView.as_view()),
    path('my-class/<int:id>/', views.MyClassView.as_view()),
    path('my-class/create/', views.MyClassView.as_view()),
    path('my-class/update/<int:id>/', views.MyClassView.as_view()),
    path('my-class/delete/<int:id>/', views.MyClassView.as_view()),
]

这很好用!/my-class当我向我发送 GET 请求时,当我向其他 URL"GET request"发送 POST 请求时,/my-class/create我会得到相同的结果。"POST request"

问题是,当我向我发送请求POST时,当我向我发送请求时/my-class/"POST request"GET/my-class/creare"GET request"

我需要 URL 仅适用于特定的请求方法。也就是说, url/my-class/create应该只适用于POST方法, url/my-class/update应该只适用于PUT方法等等。

我怎样才能做到这一点?我在文档中甚至在此处进行了很多研究,但没有找到解决方案。

标签: pythondjangohttp-method

解决方案


我试图开发一个稍微轻一点的解决方案,这样您就不必为每个请求方法创建一个类。

受 .NET Core 中此功能操作的启发,我创建了一个 decotator 以在类的每个方法中使用。这个装饰器的代码如下所示:

from django.http import HttpResponse

def http_method_list(methods):
    def http_methods_decorator(func):
        def function_wrapper(self, request, **kwargs):
            methods = [method.upper() for method in methods]
            if not request.method.upper() in methods:
                return HttpResponse(status=405) # not allowed

            return func(self, request, **kwargs)
        return function_wrapper
    return http_methods_decorator

所以在课堂上我们使用:

class MyView(View):

    @http_method_list(["GET"])
    def get(self, request):
        return HttpResponse("Only GET requests")

    @http_method_list(["POST"])
    def post(self, request):
        return HttpResponse("Only POST requests")

    # and so on

例如nowget()方法只能由GET请求执行,forpost()和类View中的其他方法相同。

我希望这对其他人有用。


推荐阅读