Python Django 404应POST请求

Python Django 404应POST请求,python,django,Python,Django,我试图在我的网站上通过POST发送表单,但是,似乎POST URL的第一部分被截断,导致它无法匹配正确的URL 我试图在模板中发送的表单: <form action= "{% url 'change_portrait' %}" method="post"> {% csrf_token %} <h5>Edit Portrait</h5> <input type="hidden" name="portrait_

我试图在我的网站上通过POST发送表单,但是,似乎POST URL的第一部分被截断,导致它无法匹配正确的URL

我试图在模板中发送的表单:

<form action= "{% url 'change_portrait' %}" method="post">
        {% csrf_token %}
        <h5>Edit Portrait</h5>
        <input type="hidden" name="portrait_id" value="{{image.pk}}">
        <button type="submit" name="button" class="btn btn-primary">Submit Changes</button>
</form>
def edit_portraits(request):
    if not request.session.get('logged_in', None):
        return redirect('../')

    portraits = Portrait.objects.filter(isSundayPortrait=True)
    context = {'portraits': portraits,
            'SundayPortraits': True}
    return render(request, 'AdminDashboard/editportraits.html', context)
和AdminDashboard.url:

urlpatterns = [
url(r'^EditPortraits/ChangePortrait/', views.change_portrait, name='change_portrait'),
url(r'^EditPortraits/', views.edit_portraits, name='edit_portraits'),
url(r'^', views.dashboard, name='dashboard'),
]
由于我不知道的某些原因,提交表单会切断初始“/AdminDashboard/”并仅针对剩余url“EditGraphics/ChangeGraphital/”进行测试。这当然会导致它跳过base urls.py中的第一个url模式(它应该去的地方),而是与第二个url匹配,随后无法匹配mainApp.url中的所有url。我一辈子都不明白为什么提交表单会切断动作URL的第一部分。它在内置的django开发服务器上按预期工作,但在部署到生产服务器时失败

任何帮助都将不胜感激

编辑

mainApp.url(这些是跟踪中显示的内容,但首先不应尝试):

views.change\u纵向视图:

def change_portrait(request):
    return HttpResponse('in')
def change_portrait(request):
    if request.method == 'POST':
        return HttpResponse('POST')
    else:
        return HttpResponse('GETTING')
这永远不会显示,这意味着它永远不会到达视图

编辑2:

还应注意,在提交表单时,我的浏览器中的url是正确的:即,它显示“mysite.com/AdminDashboard/edittraots/changetraotic/”。Django出于某种原因说,当前的URL是“/editGraphics/changeractive/”。如果我在浏览器中定期访问该url('mysite.com/AdminDashboard/edittraots/changetraotic/'),它会正确加载页面。只有当我试图发布到该页面时,它才会失败

编辑3:

可以更新视图以正确接受POST变量,如下所示:

def change_portrait(request):
    portrait_id = request.POST.get('portrait_id', None)
    return HttpResponse('in')
但是,错误仍然存在

编辑4:

呈现模板的视图:

<form action= "{% url 'change_portrait' %}" method="post">
        {% csrf_token %}
        <h5>Edit Portrait</h5>
        <input type="hidden" name="portrait_id" value="{{image.pk}}">
        <button type="submit" name="button" class="btn btn-primary">Submit Changes</button>
</form>
def edit_portraits(request):
    if not request.session.get('logged_in', None):
        return redirect('../')

    portraits = Portrait.objects.filter(isSundayPortrait=True)
    context = {'portraits': portraits,
            'SundayPortraits': True}
    return render(request, 'AdminDashboard/editportraits.html', context)
将url(r“^EditGratives/ChangeGrative/”,views.change_-grative,name='change_-grative')移动到mainApp.url(尝试匹配的位置)会导致更新mainApp.url:

urlpatterns = [
    url(r'^SundayPortraits/', views.sunday_portraits, name='sunday_portraits'),
    url(r'^Contact/', views.contact, name='contact_submission'),
    url(r'^SubmitOrder/', views.submit_buy_order, name='submit_buy_order'),
    url(r'^BuyPrint/', views.buy_print, name='buy_print'),
    url(r'^$', views.index, name='index'),
    url(r'^EditPortraits/ChangePortrait/$', views.change_portrait, name='change_portrait'),
    url(r'^Login', views.login, name='login'),
    url(r'^Logout', views.logout, name='logout')
]
mainApp.views.change\u肖像:

def change_portrait(request):
    return HttpResponse('in')
def change_portrait(request):
    if request.method == 'POST':
        return HttpResponse('POST')
    else:
        return HttpResponse('GETTING')
使用与最初显示的相同的形式,执行get请求会产生预期的HttpResponse“GETTING”。将表单更改为POST请求将导致新的堆栈跟踪:

Request Method: POST
Request URL:    http://www.example.com/EditPortraits/ChangePortrait/
Raised by:  mainApp.views.change_portrait
Using the URLconf defined in ZachWebsite.urls, Django tried these URL patterns, in this order:

^admin/
^AdminDashboard/
^ ^SundayPortraits/ [name='sunday_portraits']
^ ^Contact/ [name='contact_submission']
^ ^SubmitOrder/ [name='submit_buy_order']
^ ^BuyPrint/ [name='buy_print']
^ ^$ [name='index']
^ ^EditPortraits/ChangePortrait/ [name='change_portrait']
^ ^Login [name='login']
^ ^Logout [name='logout']
^ ^media\/(?P<path>.*)$
The current URL, ChangePortrait/, didn't match any of these.
请求方法:POST
请求URL:http://www.example.com/EditPortraits/ChangePortrait/
提出人:mainApp.views.change\u
Django使用ZachWebsite.URL中定义的URLconf,按以下顺序尝试了这些URL模式:
^管理员/
^管理仪表板/
^^SundayPortraits/[name='sunday\u肖像画']
^^Contact/[name='Contact_submission']
^^submitor/[name='submit\u buy\u order']
^^BuyPrint/[name='buy\u print']
^^$[name='index']
^^edittrapits/changerapital/[name='change\u-rapital']
^^Login[name='Login']
^^Logout[name='Logout']
^^media\/(第页*)$
当前URL changeTrapital/与其中任何一个都不匹配。

移动到mainApp.url(它应该捕捉到的位置)现在会切断该url“EditGrait/”的第一部分,现在只对您的
AdminDashboard.url中的“ChangeGrait/”进行测试:
所有正则表达式都缺少
$

注意:您的base url.py不需要在末尾有$

好的是

url(r'^EditPortraits/ChangePortrait/$',
    views.change_portrait, name='change_portrait')

经过更多的调查和测试,我似乎已经解决了这个问题。Django如何处理脚本名称和路径信息是个问题。因为表单正在发布到子url,所以url“/AdminDashboard/”的第一部分被切断并保存为脚本名称。url的其余部分“EditGratical/ChangeGratical/”被保存为路径信息。Django然后尝试根据URL匹配路径_信息。显然,它与任何内容都不匹配,因为它缺少保存在script_name中的url的第一部分。更改此行:

self.path_info = path_info
在django.core.handlers.wsgi.py中:

self.path_info = script_name + path_info
修复了该问题,现在工作正常。

您说“它在内置Django开发服务器上按预期工作,但在部署到生产服务器时失败”

对我来说,这表明在开发服务器上不存在的生产服务器上的部署存在问题。例如,可能在生产服务器上,您正在使用开发中未使用的web服务器,如Apache或NGINX


在Django收到请求之前,我会检查并再次检查任何基础设施,如web服务器、负载平衡器等,并确保它没有重写路径或向Django传递不正确的配置。

您是否也可以发布该视图
change\u-trait
?回溯不会显示应用程序
AdminDashboard
中的
URL
模式,该模式现在已显示在上面(理论上,它永远不会尝试这些)。视图只是返回一个从未发生过的HttpResponse(现在也显示在上面)。Post your views.py.
视图
处于编辑状态感谢您的建议。不幸的是,在正则表达式中添加一个结尾$仍然会导致相同的错误。回溯是相同的吗?是的,它仍然在切断“/AdminDashboard/”,并且仅针对“EditGraphics/ChangeGraphital/”进行测试,这会导致相同的回溯。您是否已从settings.py在已安装的应用程序中注册此应用程序?我注册了。有关更多信息,请参阅编辑2。如果我正常访问该url而不进行发布,但在尝试发布时失败,则此应用程序有效。非常奇怪
self.path_info = script_name + path_info