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

Python 在Flask/SQLAlchemy中使用相同表单编辑帖子,python,flask,sqlalchemy,flask-sqlalchemy,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

我是编程新手,正在努力创建一个包含帖子和评论的简单博客。我无法使用相同的表单模板创建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))
@app.route(“/editpost/”,方法=['GET','POST'])
def editpost(id):
title=请求。表单['title']
text=request.form['content']
post=db.session.query(post.filter)(post.id==id).first()
post.title=标题
post.body=内容
db.session.commit()
返回重定向(url_for(“post”,id=id))

感谢您的帮助。谢谢

您有一个端点,
editpost
,它支持GET和POST请求。但是,端点内的代码假定一个有效的POST请求。由于以下原因,您收到了错误的请求错误:

title = request.form['title']
text = request.form['content']
第一行是您得到错误的地方,但任何一行都会导致错误<代码>请求。表单由post请求中的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)
@app.route('/editpost/',方法=['GET','POST'])
def editpost(id):
post=db.session.query(post.filter)(post.id==id).first()
如果request.method==“POST”:
title=请求。表单['title']
text=request.form['content']
post.title=标题
post.body=内容
db.session.commit()
返回重定向(url_for('post',id=id))
其他:
返回呈现模板('something.html',post=post)

您遇到了哪些具体问题?@dirn我已经更新了我正在处理的内容,但我一直收到一个错误的请求。谢谢!我不再收到错误,但当我用posts.html替换something.html时,它会将我带回到addpost页面,并添加一篇额外的文章,而不是编辑。我没有答案我做错什么了吗?你没有提供答案,所以很难告诉你你的流程有什么问题。“posts.html”似乎是您列出所有帖子的页面。我怀疑你会有一个不同的模板来添加/编辑帖子。