如何在金字塔中POST后重定向?

dav*_*ave 19 python post pylons redirect pyramid

我正在尝试让我的表单提交到一条路线,该路线将验证数据然后重定向回原始路线.

例如:

  • 用户加载页面website.com/post
  • 表格将数据发布到website.com/post-save
  • 用户被重定向回website.com/post

金字塔给我带来了一些麻烦.

这是我瘦弱的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)
Run Code Online (Sandbox Code Playgroud)

这是我一直在玩的代码.它不仅不起作用,而且感觉很乱并且被黑了.肯定有一种更简单的方法可以在金字塔中"重定向POST后"?

Mic*_*kel 27

简单地POST到您的表单所显示的相同URL,只需在POST成功时将用户重定向到远离页面的位置,即可轻松解决问题.这样,在表单成功提交之前,您不会更改URL.

如果您只是想要POST到不同的URL,那么您需要使用会话保存数据,因为您显然在请求之间处理表单数据.

通常,如果您希望能够处理表单中的错误,则可以使用会话和Flash消息.要执行此操作,您只需使用pyramid_beaker之类的内容添加闪存消息的位置以显示在基本模板和设置会话支持中.

假设您的主页设置在'home'enign-route:

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,
    }
Run Code Online (Sandbox Code Playgroud)

请注意如果表单无法验证您是否使用与最初呈现表单相同的代码,并且只有在成功时才重定向.此格式还可以处理使用提交中使用的值和默认值填充表单.

您可以使用request.session.peek_flash()和遍历所选模板中的Flash消息request.session.pop_flash().

route_url 如果要标记主页视图以检查会话数据,也支持在生成的URL上更改查询字符串.

显然,您可以将查询字符串中的所有内容传递回主页,但这是一个非常大的安全漏洞,会话可以帮助防范.


Joh*_*ess 8

Pyramid文档有一个特别的关键部分,其中包含以下示例:

from pyramid.httpexceptions import HTTPFound

def myview(request):
    return HTTPFound(location='http://example.com')
Run Code Online (Sandbox Code Playgroud)