python - 如何在 Pyramid 中 POST 后重定向?

标签 python post redirect pylons pyramid

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

例如:

  • 用户加载页面 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 中肯定有一种更简单的“在 POST 后重定向”的方法吗?

最佳答案

您的问题最容易解决,方法是简单地发布到显示表单的同一 URL,并在 POST 成功时将用户重定向到页面之外。这样,在成功提交表单之前,您都不会更改 URL。

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

通常,如果您希望能够处理表单中的错误,您会使用 session 和闪存消息。为此,您只需在基本模板中添加一个显示 Flash 消息的位置,并使用诸如 pyramid_beaker 之类的设置 session 支持。

假设您的主页设置在 '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() 在您选择的模板中循环浏览 Flash 消息。

route_url 也支持在生成的 url 上更改查询字符串,如果您想标记主页 View 以检查 session 数据。

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

关于python - 如何在 Pyramid 中 POST 后重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610087/

相关文章:

Javascript/Ajax 重定向问题

python - 元组索引超出范围? python 3.4.2

Python 负二项式回归 - 结果与 R 中的结果不匹配

python - 使用 Python 比较 2 个 excel 文件

python - 在class1内调用class2时出现AttributeError,class1没有__init__属性

android - 通过 Retrofit 从内存上传位图

php - 将所有内容重定向到 index.php

ios - Alamofire JSON POST 结果错误 : The network connection was lost

php - 使用 PDO 变量将 $_POST 值传递到函数参数中

php - 限制直接页面访问