如何在Pyramid中实现POST后的重定向?

19 投票
6 回答
20615 浏览
提问于 2025-04-16 15:25

我想让我的表单提交到一个特定的地址,这个地址会验证数据,然后再把用户重定向回原来的页面。

举个例子:

  • 用户打开页面 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 也支持在生成的网址上修改查询字符串,如果你想让主页视图检查会话数据。

当然,你可以把所有内容通过查询字符串传回主页,但这会带来很大的安全隐患,而会话可以帮助保护你免受这种风险。

撰写回答