Приложение 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
.