【问题标题】:Django POST 405 method not allowed unless rule comes first除非规则首先出现,否则不允许使用 Django POST 405 方法
【发布时间】:2019-09-30 14:36:29
【问题描述】:

我的 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 请求,但该请求会导致以下错误:

不允许的方法 (POST):/try_signin
不允许的方法:/try_signin
[2019 年 9 月 30 日 14:20:38]“POST /try_signin HTTP/1.1”405 0

但是,如果我重新排序 URL 规则以便 POST 规则首先出现,那么它可以正常工作。我看到的规则没有冲突。我是 Django 新手,仍在学习,但我想了解为什么重新排序规则可以避免错误,或者我正在做/不做的其他事情是否会导致错误。

这是我的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 中,它确实有效。

【问题讨论】:

  • 请将视图 try_signin 添加到您的问题中。

标签: django django-urls


【解决方案1】:

re_path('^$|signin', ...) 匹配 URL /try_signin。因此,当您发布到此 URL 时,它会转到仅接受 GET 请求的 signin.htmlTemplateView

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2019-07-05
    • 2016-02-15
    • 2014-04-18
    • 2014-05-23
    • 1970-01-01
    • 2018-12-20
    • 2015-11-16
    • 2016-05-15
    相关资源
    最近更新 更多