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

时间:2017-06-11 23:55:29

标签: python flask

到目前为止,我有这个:

@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

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

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 个答案:

答案 0 :(得分:0)

我最后刚刚做了:

@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'周围的引号