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 请求。
我的 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 请求。