编辑帖子在Flask / SQLAlchemy中使用相同的表单

时间:2015-12-05 19:12:44

标签: python flask sqlalchemy flask-sqlalchemy

我是编程新手,正在创建一个包含帖子和评论的简单博客。我在使用相同的表单模板创建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))

感谢任何帮助。谢谢!

1 个答案:

答案 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)