Flask:提交后如何重定向到帖子视图?

Posted

技术标签:

【中文标题】Flask:提交后如何重定向到帖子视图?【英文标题】:Flask: How to redirect to the post view after it has been submitted? 【发布时间】:2017-11-13 08:38:26 【问题描述】:

到目前为止我有这个:

@app.route('/view/<postname>')
def view_post(postname):

    posts_folder = os.path.abspath(os.path.join(app.root_path, 'content', 'posts'))
    filename = safe_join(posts_folder, postname)
    with open(filename, 'rb') as f:
        content = f.read()
        html = markdown.markdown(content)
        return render_template("view.html",html=html,postname=postname)

class PostForm(FlaskForm):
    postTitle = StringField('postTitle', validators=[DataRequired()])
    postText = TextAreaField('postText',validators=[DataRequired()])

@app.route('/submit', methods=('GET', 'POST'))
def submit():
    postname = request.form["postTitle"]
    print postname
    posts_folder = os.path.abspath(os.path.join(app.root_path, 'content', 'posts'))
    filename = safe_join(posts_folder, postname)
    with open(filename,'wb') as f:
        f.write(request.form['postText'])
    while True:
        if os.path.exists(filename):
            return redirect(url_for(view_post(postname)))
            break
        else:
            pass

如您所见,我有一个表单,当它提交时,它指向我的 /submit 路由。此路由创建一个新的帖子文件并将帖子的内容写入其中。然后,它应该重定向到查看帖子路由,以便它可以看到最近创建的帖子。在尝试加载此路由之前,它需要等到帖子完成对文件的写入。你可以看到我试图在 while True 循环中处理这个问题。但是,现在错误显示:

BuildError: Could not build url for endpoint u'<!DOCTYPE html>\n<html>\n&lt;p&gt;b&lt;/p&gt;\n<br>\n<a href="/edit/a">\n        a\n    </a>\n\n<html>'. Did you mean 'edit_post' instead?

好像 url_for(view_post(postname)) 以某种方式试图查看原始 html。但是,当我打印 postname 时,它​​会打印 postTitle 对象的内容,这是我打算保存并重新路由到的文件名。

【问题讨论】:

【参考方案1】:

我最终只是做了:

@app.route('/submit', methods=('GET', 'POST'))
def submit():
    postname = request.form["postTitle"]
    print postname
    posts_folder = os.path.abspath(os.path.join(app.root_path, 'content', 'posts'))
    filename = safe_join(posts_folder, postname)
    with open(filename,'wb') as f:
        f.write(request.form['postText'])
    return redirect(url_for('view_post', postname=postname))

这行得通!问题是它不会等到文件加载,这对于真正的大文件来说可能是个问题。但似乎它们必须相当大。虽然我会留下这个问题,以防有人有实际答案(假设文件上传确实需要相当长的时间)。我的错误也发生了,因为我忘记了底部 url_for 重定向中“view_post”周围的引号

【讨论】:

以上是关于Flask:提交后如何重定向到帖子视图?的主要内容,如果未能解决你的问题,请参考以下文章

表单提交后PHP重定向到另一个页面

如何在 Flask 上使用 args 重定向视图函数而不使用查询字符串?

将提交时的重力表单重定向到刚刚创建的帖子

表单验证重定向问题

如何将视图块重定向到显示页面

在Wordpress上发布保存后更改重定向URL