python - Django:特定请求方法的 URL
问题描述
我正在使用 Django,并且正在使用带有 url 的基于类的视图。因此,在 mu 类中,我有方法:post
、和.get
put
delete
例子:
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
方法等等。
我怎样才能做到这一点?我在文档中甚至在此处进行了很多研究,但没有找到解决方案。
解决方案
我试图开发一个稍微轻一点的解决方案,这样您就不必为每个请求方法创建一个类。
受 .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中的其他方法相同。
我希望这对其他人有用。
推荐阅读
- html - 使用悬停功能时如何解决此溢出问题
- java - Java 应用程序/IDE 未打开(IntelliJ、Toolbox、NetBeans)
- c++ - 获取 Y/n 的输入,不输入就获取 'n'?
- css - 动画 SVG 箭头和 z-index
- github-cli - 如何在通过 Git-CLI 创建 repo 时将 gitignore 文件和许可证设置为 None 并将 add "origin" git remote 设置为 Yes all?
- sql - 如何统计同一天发生的客户行为发生次数?
- python - 我在 django 中收到 No reverse match 错误,但它使用 urls.py
- java - Android(Java)是否有任何类似于 PHP 的 file_get_contents($url) 的功能?
- flutter - 如何使用 FLUTTER-FFMPEG 对图像和视频应用过滤器
- python - 返回字典中具有最高值的键