Метод Django POST 405 не допускается, если правило не на первом месте - PullRequest
0 голосов
/ 30 сентября 2019

Приложение My Django (2.2.5) имеет следующее urls.py:

from django.urls import path
from django.urls.conf import re_path
from django.views.generic.base import TemplateView
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from . import views

urlpatterns = [

    re_path('^$|signin', TemplateView.as_view(template_name='signin.html'), name='signin'),
    path('forgot', TemplateView.as_view(template_name='forgot.html'), name='forgot_pass'),
    path('app', TemplateView.as_view(template_name='core.html'), name='core'),

    path('try_signin', views.try_signin, name='try_signin'),      

] + staticfiles_urlpatterns()

Первые 3 правила работают нормально и обслуживают соответствующий контент HTML. Четвертое правило относится к запросу POST, но запрос вызывает следующую ошибку:

Метод не разрешен (POST): / try_signin
Метод не разрешен: / try_signin
[30 /Sep / 2019 14:20:38] "POST / try_signin HTTP / 1.1" 405 0

Однако, если я переупорядочив правила URL-адресов так, чтобы правило POST было первым, тогда оно работает нормально. Там нет конфликта в правилах, которые я вижу. Я новичок в Django и все еще учусь, но я хотел бы понять, почему изменение порядка правил позволяет избежать ошибки, или если есть что-то, что я делаю / не делаю, что вызвало ошибку.

Этоis my views.py:

from django.http.response import JsonResponse
from time import sleep
import logging
import json

log = logging.getLogger(__name__)

def try_signin(request):
    user_email = request.POST.get('user', None)
    password = request.POST.get('pass', None)
    log.info("Signin attempt ==> [%s] [%s]" % (user_email, password))
    sleep(2)
    data = {
        'success': False
    }
    log.info("Returning response ==> %s" % json.dumps(data))
    return JsonResponse(data)

Кроме того, добавление декоратора @require_POST к функции try_signin, приведенной выше, по-прежнему вызывает ошибку. Как я уже говорил ранее, это работает, если я переупорядочиваю правило, чтобы оно появилось первым в url_patterns.

1 Ответ

1 голос
/ 30 сентября 2019

re_path('^$|signin', ...) соответствует URL /try_signin. Поэтому, когда вы отправляете POST по этому URL, он переходит к TemplateView для signin.html , который принимает только запросы GET.

...