5

Flask を使用してフォーラム プロジェクトを作成し、Flask-SQLAlchemy を使用してすべてのユーザー、スレッド、投稿などを管理しています。ただし、x を実行しようとすると (投稿を編集するなど)、他のことをしようとすると (投稿を削除するなど)、InvalidRequestError が返されることがわかりました。

投稿を編集するには、

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

投稿を削除したり、

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

そして投稿する

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

残念ながら、この問題を解決する唯一の確実な方法は、アプリを実際に実行するスクリプト run.py をリセットすることです。

#!bin/python

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

2 に答える 2

3

問題の一部である可能性があるため、WooshAlchemy を使用していますか。ここに記載

彼は、WooshAlchemy 拡張機能の変更を必要とする「修正」について説明しています。

通常は、Post モデル オブジェクトを呼び出してから「session.add」を使用してアタッチし、「session.delete」を試行するか、同じオブジェクトに対して別の「session.add」を実行したことを意味します。

また、リクエストのルーティングはフラスコにとって少し奇妙です。以前にFlaskで「thr = <t_id>」タイプの表記を見たことはありません。それはあなたにとってうまくいっていますか?

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

于 2013-05-13T20:31:55.660 に答える