title: Flask-SQLAlchemy InvalidRequestError: Object is already attached to session
body: <p>I'm creating a forum project using Flask, and managing all the users, threads, posts, etc. using Flask-SQLAlchemy. However, I've found that when I attempt to do x (e.g. edit a post), I get an InvalidRequestError if I attempt to do anything else (e.g. delete the post).</p>
  
  <p>For editing a post,</p>
  
  <pre><code>def post_edit(id, t_id, p_id):
    post = Post.query.filter_by(id=p_id).first()
    if post.author.username == g.user.username:
      form = PostForm(body=post.body)
      if form.validate_on_submit():
        post.body = form.body.data
        db.session.commit()
        return redirect(url_for('thread', id=id, t_id=t_id))
      return render_template('post_edit.html', form=form, title='Edit')
    else:
      flash('Access denied.')
      return redirect(url_for('thread', id=id, t_id=t_id))
  </code></pre>
  
  <p>and deleting a post,</p>
  
  <pre><code>@app.route('/forum=&lt;id&gt;/thr=&lt;t_id&gt;/p=&lt;p_id&gt;/delete', methods=['GET','POST'])
  def post_delete(id, t_id, p_id):
    post = Post.query.filter_by(id=p_id).first()
    if post.author.username == g.user.username:
      db.session.delete(post)
      db.session.commit()
      return redirect(url_for('thread', id=id, t_id=t_id))
    else:
      flash('Access denied.')
      return redirect(url_for('thread', id=id, t_id=t_id))
  </code></pre>
  
  <p>and posting a post</p>
  
  <pre><code>@app.route('/forum/id=&lt;id&gt;/thr=&lt;t_id&gt;', methods=['GET','POST'])
  def thread(id, t_id):
    forum = Forum.query.filter_by(id=id).first()
    thread = Thread.query.filter_by(id=t_id).first()
    posts = Post.query.filter_by(thread=thread).all()
    form = PostForm()
    if form.validate_on_submit():
      post = Post(body=form.body.data,
                  timestamp=datetime.utcnow(),
                  thread=thread,
                  author=g.user)
      db.session.add(post)
      db.session.commit()
      return redirect(url_for('thread', id=id, t_id=t_id))
    return render_template('thread.html', forum=forum, thread=thread, posts=posts, form=form, title=thread.title)
  </code></pre>
  
  <p>Unfortunately, the only surefire way to make this problem resolve itself is to reset the script that actually runs the app, run.py</p>
  
  <pre><code>#!bin/python
  
  from app import app
  app.run(debug=True,host='0.0.0.0')
  </code></pre>