Django POST 405 方法不允许,除非规则先出现

Django POST 405 method not allowed unless rule comes first

我的 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 内容。第 4 条规则针对 POST 请求,但该请求导致以下错误:

Method Not Allowed (POST): /try_signin
Method Not Allowed: /try_signin
[30/Sep/2019 14:20:38] "POST /try_signin HTTP/1.1" 405 0

但是,如果我重新排列 URL 规则,使 POST 规则排在第一位,那么它就可以正常工作。我能看到的规则没有冲突。我是 Django 的新手并且仍在学习,但我想了解为什么重新排序规则可以避免错误,或者如果我 doing/not 这样做会导致错误。

这是我的 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)

另外,给上面的try_signin函数加上@require_POST装饰器,还是报错。正如我之前所说,如果我将规则重新排序为首先出现在 url_patterns.

中,它确实有效

re_path('^$|signin', ...) 匹配 url /try_signin。因此,当您 POST 到此 URL 时,它会转到 TemplateView for signin.html,它只接受 GET 请求。