0

私のコード行は次のとおりです。

post = Post(title=form.title.data, slug=form.slug.data, body=form.body.data, user=g.user)

users.py私はブループリントを使用しており、自分の でユーザーを作成し、現在アクセスしていることに注意してください

g.user追加するbackref = 'user'

そしてエラーに直面する

 AttributeError: '_RequestGlobals' object has no attribute 'user'

users.py で g.user を次のように設定しました。

@users.route('/signup', methods=['GET', 'POST'])
def signup():
  form = SignupForm()

  if request.method == 'POST':
    if form.validate() == False:
      return render_template('users/signup.html', form=form)
    else:
      g.user = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)
      db.session.add(g.user)
      db.session.commit()
      session['email'] = g.user.email
      return redirect(url_for('users.profile'))

  elif request.method == 'GET':
    return render_template('users/signup.html', form=form)
4

1 に答える 1

1

gグローバルは、サーバーごとではなく、リクエストごとです。次のリクエストgは再び空です。Application Globalsのドキュメントを引用する:

ある関数から別の関数への 1つの要求に対してのみ有効なデータを共有するには、グローバル変数は十分ではありません。スレッド化された環境では壊れるからです。Flask は、アクティブなリクエストに対してのみ有効であり、リクエストごとに異なる値を返す特別なオブジェクトを提供します。

(私のものを強調)

@app.before_requestハンドラーを使用して、リクエストごとにユーザーを再度読み込み、キーを探しsession['email']ます。リクエストからリクエストまでユーザーを追跡するために、より安全なものを使用することを検討することをお勧めします。Flask-Login のようなアドオンは、これらすべてを処理できます。

于 2014-09-16T07:28:49.697 に答える