我是编程新手,正在创建一个包含帖子和评论的简单博客。我在使用相同的表单模板创建editpost功能时无法添加帖子。这是我添加帖子的数据模型:
@app.route("/addpost", methods=['POST'])
def addpost():
title = request.form['title']
text = request.form['content']
post = Post(title = title, body = content)
db.session.add(post)
db.session.commit()
return redirect(url_for("posts"))
这是我目前所拥有的,但我收到了错误的代理请求。
@app.route("/editpost/<int:id>", methods=['GET', 'POST'])
def editpost(id):
title = request.form['title']
text = request.form['content']
post = db.session.query(Post).filter(Post.id==id).first()
post.title = title
post.body = content
db.session.commit()
return redirect(url_for("post", id=id))
感谢任何帮助。谢谢!
答案 0 :(得分:2)
您有一个端点editpost
,它支持GET和POST请求。但是,端点内的代码假定有效的POST请求。由于
title = request.form['title']
text = request.form['content']
第一行是你得到错误的地方,但是任何一行都会导致错误。 request.form
由POST请求中的帖子数据填充。当有人提交GET请求时(您可能提供了指向编辑页面的链接,导致GET),request.form
不包含这些键中的任何一个。 Flask捕获引发的KeyError
并将其替换为BadRequest
。
要防止这种情况发生,您必须做两件事。首先,当请求是POST时,您只想这样做。假设您想使用相同的端点和URL来显示编辑表单并执行更新,那么您希望将代码包含在内部
if request.method == 'POST':
接下来,因为您可能希望在字段丢失时显示表单和一些错误消息,所以在访问值时,您会希望更加防御。
title = request.form.get('title')
text = request.form.get('content')
全部放在一起:
@app.route('/editpost/<int:id>', methods=['GET', 'POST'])
def editpost(id):
post = db.session.query(Post).filter(Post.id==id).first()
if request.method == 'POST':
title = request.form['title']
text = request.form['content']
post.title = title
post.body = content
db.session.commit()
return redirect(url_for('post', id=id))
else:
return render_template('something.html', post=post)