我试图在我的网站上通过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/”进行测试
在您的
AdminDashboard.urls
中: 所有的正则表达式都缺少$
好的是
^{pr2}$您会说“它在内置Django开发服务器上按预期工作,但部署到生产服务器时失败”。在
对我来说,这表明生产服务器上的部署有问题,而开发服务器上不存在。例如,可能在生产服务器上,您正在使用一个web服务器,如Apache或NGINX,而这些服务器不是在开发中使用的。在
我会在Django之前检查并复查任何基础设施,如web服务器、负载平衡器等,并确保它不会重写路径或以其他方式将不正确的配置传递给Django。在
经过更多的调查和测试,我似乎已经解决了问题。结果是Django处理脚本名和路径信息的方式有问题。因为表单是发布到子url的,所以url“/adminidashboard/”的第一部分被截断并保存为脚本名。url的其余部分“EditPortrait/ChangePortrait/”被保存为路径“信息”。然后Django尝试将path_info与url进行匹配。显然,它与任何内容都不匹配,因为它缺少保存在script_name中的url的第一部分。更改此行:
在django.core.handlers处理程序.wsgi.py收件人:
^{pr2}$修复了问题,现在工作正常。在
相关问题 更多 >
编程相关推荐