2013-05-13 7 views
5
angeschlossen.

Ich erstelle ein Forum-Projekt mit Flask und verwalte alle Benutzer, Threads, Beiträge usw. mit Flask-SQLAlchemy. Ich habe jedoch festgestellt, dass ich einen InvalidRequestError erhalte, wenn ich versuche, x zu tun (z. B. einen Post bearbeiten), wenn ich versuche, etwas anderes zu tun (z. B. den Post zu löschen).Flask-SQLAlchemy InvalidRequestError: Objekt ist bereits an Sitzung

Für einen Beitrag bearbeiten,

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

und einen Beitrag zu löschen,

@app.route('/forum=<id>/thr=<t_id>/p=<p_id>/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)) 

und veröffentlichen einen Beitrag

@app.route('/forum/id=<id>/thr=<t_id>', 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) 

Leider den einzigen absolut sicheren Weg, dieses Problem zu beheben machen selbst ist das Skript zurückzusetzen, das tatsächlich die App läuft, run.py

#!bin/python 

from app import app 
app.run(debug=True,host='0.0.0.0') 

Antwort

3

Verwenden Sie WooshAlchemy, weil es ein Teil Ihres Problems sein könnte. Described here

Er beschreibt das "Fix", das eine Änderung der WooshAlchemy-Erweiterung erfordert.

Normalerweise könnte es bedeuten, dass Sie ein Post-Modell-Objekt aufgerufen und dann mit "session.add" angefügt und dann versucht, "session.delete" oder eine andere "session.add" für das gleiche Objekt.

Auch Ihre Anfrage Routing ist ein bisschen seltsam für Kolben Ich habe nie die "thr = <t_id>" Art der Notation mit Flask vorher gesehen. Hat das gut für Sie funktioniert?

http://flask.pocoo.org/docs/quickstart/#variable-rules

+0

Sieht aus wie WhooshAlchemy in der Tat das Problem war. Wie für die Notation ist es nur eine Kurzschrift für "thr = ". – Ganye

+0

Ich meinte den "thr =" Teil. Aber ich denke, du könntest/thr = 44/p = 32/c = 21 Art von URL-Format, ich fand es einfach seltsam, das ist alles. Ich bin froh, dass wir das Problem herausgefunden haben. – Dexter

+0

Genau das ist es; So erzeugt zum Beispiel ein bestimmter Thread (8) in einem Forum (1) die URL "/ forum/id = 1/thr = 8". – Ganye

0

Ich denke, Ihre Bearbeitung Post ist nicht richtig gemacht. Verwenden Sie die Funktion populate_obj.

Verwandte Themen