到目前为止,我有这个:
@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<p>b</p>\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对象的内容,这是我打算保存并重新路由到的文件名。
答案 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'周围的引号