Django: URL для конкретного метода запроса - PullRequest
0 голосов
/ 09 ноября 2019

Я работаю с Django, и я использую основанные на классе представления с URL. Итак, в мю-классах у меня есть методы: 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')

Так что в моих URL-адресах у меня есть что-токак:

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()),
]

Это прекрасно работает! Когда я отправляю запрос GET на /my-class, я получаю "GET request", а когда я отправляю запрос POST на /my-class/create, я получаю "POST request" то же самое для других URL-адресов.

Проблема в том, что когда яотправить POST запрос на /my-class/ Я получаю "POST request" и когда я отправляю GET запрос на /my-class/creare Я получаю "GET request"

Мне нужно, чтобы URL работал только для определенного запросаметод. То есть url /my-class/create должен работать только для метода POST, url /my-class/update должен работать только для метода PUT и т. Д.

Как это сделать? Я много исследовал, в документации и даже здесь, но не нашел решения.

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Вы можете ограничить методы http, используя http_method_names. Но вы должны разделить классы представления.

Например:

from .views import PostView

urlpatterns = [
    path('only_post/', PostView.as_view(), name='post'),
]

и ваше представление:

class PostView(View):
    http_method_names = ['post']

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

Теперь вы можете отправлять только запросы на это сообщение. в противном случае вы получите ошибку HTTP ERROR 405 .

0 голосов
/ 13 ноября 2019

Я попытался разработать более легкое решение, чтобы вам не нужно было создавать класс для каждого метода запроса.

Вдохновленный работой этой функции в .NET Core, я создал декотатор для использования вкаждый метод класса. Код этого декоратора показан ниже:

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

Теперь get() метод, например, может быть выполнен только по запросу GETто же самое для post() и других методов класса View.

Надеюсь, это может быть полезно для кого-то еще.

...