Django 404发布请求

2024-10-04 11:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在我的网站上通过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>

正确呈现为:

^{pr2}$

操作URL是正确的,并且是我希望表单提交到的位置。但是,当提交表单时,我收到404,并显示以下消息:

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']
^ ^Login [name='login']
^ ^Logout [name='logout']
^ ^media\/(?P<path>.*)$

The current URL, EditPortraits/ChangePortrait/, didn't match any of these.

这是我的基地网址.py在

urlpatterns = [
url(r'^AdminDashboard/', include('AdminDashboard.urls')),
url(r'^', include('mainApp.urls'))
]

以及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“editHightalics/ChangePortrait/”进行测试。这当然会导致它跳过基中的第一个url模式网址.py(它应该去哪里),而是与catch all第二个url匹配,随后无法匹配中的所有urlmainApp.url. 我一辈子都搞不懂为什么提交表单会切断操作URL的第一部分。它在内置django开发服务器上按预期工作,但在部署到生产服务器时失败。在

任何帮助都将不胜感激。在

编辑

在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'^Login', views.login, name='login'),
url(r'^Logout', views.logout, name='logout')
]

在views.change_纵向公司名称:

def change_portrait(request):
    return HttpResponse('in')

这永远不会显示,也就是说它永远无法进入视野。在

编辑2:

还应注意,提交表单时,我浏览器中的url是正确的:即显示'mysite.com/AdminDashboard/editHightalights/ChangePortrait/'. 出于某种原因,Django说当前的URL是'/editHights/ChangePortrait/'。如果我转到那个网址('mysite.com/AdminDashboard/editHightalights/ChangePortrait/'在我的浏览器中,它会定期正确地加载页面。只有当我试图发布到那个页面时,它才会失败。在

编辑3:

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

def change_portrait(request):
    portrait_id = request.POST.get('portrait_id', None)
    return HttpResponse('in')

但是错误仍然存在。在

编辑4:

呈现模板的视图:

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“^editHighraits/ChangePortrait/”,views.change_纵向,name='change_portrait')至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_纵向公司名称:

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.

移动到mainApp.url(它应该在哪里捕捉它)现在切断了url“EditPortrait/”的第一部分,现在只对“ChangePortrait/”进行测试


Tags: nameurl表单requestorderbuychangepost
3条回答

在您的AdminDashboard.urls中: 所有的正则表达式都缺少$

Note: your base urls.py doesn't need to have the $ at the end

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

好的是

^{pr2}$

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

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

我会在Django之前检查并复查任何基础设施,如web服务器、负载平衡器等,并确保它不会重写路径或以其他方式将不正确的配置传递给Django。在

经过更多的调查和测试,我似乎已经解决了问题。结果是Django处理脚本名和路径信息的方式有问题。因为表单是发布到子url的,所以url“/adminidashboard/”的第一部分被截断并保存为脚本名。url的其余部分“EditPortrait/ChangePortrait/”被保存为路径“信息”。然后Django尝试将path_info与url进行匹配。显然,它与任何内容都不匹配,因为它缺少保存在script_name中的url的第一部分。更改此行:

self.path_info = path_info

在django.core.handlers处理程序.wsgi.py收件人:

^{pr2}$

修复了问题,现在工作正常。在

相关问题 更多 >