首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在金字塔中发布后如何重定向?

在金字塔中发布后如何重定向?
EN

Stack Overflow用户
提问于 2011-04-10 14:06:39
回答 6查看 19.7K关注 0票数 19

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

例如:

website.com/post

  • Form将数据发布到website.com/post-save

  • User后,将重定向回website.com/post

  • 用户将加载该页面

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

这是我的瘦身views.py

代码语言:javascript
复制
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)

这是我一直在使用的代码。它不仅不能工作,而且还让人感觉混乱和混乱。在金字塔中肯定有一种更简单的方法来“后重定向”?

EN

回答 6

Stack Overflow用户

发布于 2011-04-13 04:19:28

您的问题最容易解决的方法是:简单地POSTing到显示表单的同一个URL,并在POST成功时简单地将用户从页面重定向离开。这样,在表单成功提交之前,您不能更改URL。

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

通常,如果您希望能够处理表单中的错误,则可以使用会话和flash消息。要做到这一点,您只需添加一个位置的闪光消息出现在您的基本模板和设置会话支持使用类似pyramid_beaker的东西。

假设您的主页设置在“home”的命名路由上:

代码语言:javascript
复制
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上的查询字符串。

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

票数 27
EN

Stack Overflow用户

发布于 2011-04-10 14:24:01

金字塔文档有一个特别的单点section,其中包含以下示例:

代码语言:javascript
复制
from pyramid.httpexceptions import HTTPFound

def myview(request):
    return HTTPFound(location='http://example.com')
票数 8
EN

Stack Overflow用户

发布于 2011-04-15 19:39:05

我是这样做的:

代码语言:javascript
复制
from pyramid.httpexceptions import HTTPCreated

response = HTTPCreated()
response.location = self.request.resource_url( newResource )
return response

这将发送HTTP创建的代码,201

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5610087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档