如何在Pyramid中实现POST后的重定向?
我想让我的表单提交到一个特定的地址,这个地址会验证数据,然后再把用户重定向回原来的页面。
举个例子:
- 用户打开页面 website.com/post
- 表单把数据提交到 website.com/post-save
- 用户会被重定向回 website.com/post
在使用Pyramid框架时,我遇到了一些麻烦。
这是我简化后的 views.py 代码:
def _get_link_form(post_data):
""" Returns the initialised form object """
return LinkForm(post_data)
def home_page(request):
form = _get_link_form(request.POST)
return {'form' : form}
def save_post(request):
""" form data is submitted here """"
form = _get_link_form(request.POST)
if not form.validate():
return home_page(request, form)
这是我尝试过的代码。不仅没有成功,而且感觉很乱,像是拼凑起来的。难道在Pyramid中没有更简单的方法来实现“提交后重定向”吗?
6 个回答
1
我这样做:
from pyramid.httpexceptions import HTTPCreated
response = HTTPCreated()
response.location = self.request.resource_url( newResource )
return response
这样会发送一个HTTP状态码,表示创建成功,代码是201。
9
Pyramid的文档中有一段特别贴切的内容,里面有一个很好的示例:
from pyramid.httpexceptions import HTTPFound
def myview(request):
return HTTPFound(location='http://example.com')
27
你的问题可以通过简单地向表单所在的同一个网址发送POST请求来解决。当POST请求成功后,直接把用户引导离开这个页面。这样,在表单成功提交之前,你的网址不会发生变化。
如果你非要向不同的网址发送POST请求,那你就需要使用会话来保存数据,因为你显然是在处理请求之间的表单数据。
通常,如果你想处理表单中的错误,你会使用会话和闪存消息。这样做的方法是,在你的基本模板中添加一个位置来显示闪存消息,并使用像pyramid_beaker这样的工具来设置会话支持。
假设你的主页设置在名为'home'的路由上:
from pyramid.httpexceptions import HTTPFound
def myview(request):
user = '<default user field value>'
if 'submit' in request.POST:
user = request.POST.get('user')
# validate your form data
if <form validates successfully>:
request.session.flash('Form was submitted successfully.')
url = request.route_url('home')
return HTTPFound(location=url)
return {
# globals for rendering your form
'user': user,
}
注意,如果表单验证失败,你会使用最初渲染表单时的相同代码,只有在成功时才会进行重定向。这种格式还可以处理用在提交中的值填充表单,以及默认值。
你可以在你选择的模板中使用 request.session.peek_flash()
和 request.session.pop_flash()
来循环显示闪存消息。
route_url
也支持在生成的网址上修改查询字符串,如果你想让主页视图检查会话数据。
当然,你可以把所有内容通过查询字符串传回主页,但这会带来很大的安全隐患,而会话可以帮助保护你免受这种风险。