2

このエラーが発生しました。現在はレンガの壁であるため、何らかの入力が必要です。

フラスコログインを介してcurrent_userをインポートするフラスコセキュリティを使用しているアプリケーションがあります。統合の問題は過去のものであり、しばらく前からありました。

gに配置する特定の情報のリクエストをフィルタリングする必要がありました。機能する青写真があり、統合の問題は過去のものです。

昨日、私はこの要求フィルタリング ブループリント関数を一般的な拡張機能に抽出しました。これは基本的に情報を g にフィルタリングし、構成が容易になるため、多かれ少なかれ準備が整い、テスト済みです。この拡張機能は、このブループリントを置き換えて、クロス アプリケーション リクエスト フィルターを作成します。

私はこれを自分のアプリケーションに戻します。これを取得しているのは今だけです。述べたように、それは不透明です: ユーザーが RequestContext にない場所や理由がわかりません

Traceback (most recent call last):
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1356, in full_dispatch_request
    rv = self.preprocess_request()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask/app.py", line 1539, in preprocess_request
    rv = func()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Flask_Flarf-0.0.1-py2.7.egg/flask_flarf/flarf.py", line 48, in preprocess_request
    preprocess_func(r)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 10, in preprocess_with_user
    g.preprocessed = current_app.extensions['flarf'].preprocess_cls(request)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 17, in __init__
    self.aid = self.determine_account(request)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/Project_Producer-0.0.1-py2.7.egg/project_producer/config/configs/request_filters_config.py", line 51, in determine_account
    current_user.account.identifier])
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/werkzeug/local.py", line 336, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/werkzeug/local.py", line 295, in _get_current_object
    return self.__local()
  File "/home/zv/.virtualenvs/j/lib/python2.7/site-packages/flask_login.py", line 403, in <lambda>
    current_user = LocalProxy(lambda: _request_ctx_stack.top.user)
AttributeError: 'RequestContext' object has no attribute 'user'

理論:

1) この関数:

def preprocess_request(preprocess_func=self.preprocess_func):
        r = _request_ctx_stack.top.request
        request_endpoint = str(r.url_rule.endpoint).rsplit('.')[-1]
        if request_endpoint not in _flarf.preprocess_skip:
            preprocess_func(r)

上記のトレースで起こっていることは、preprocess_request の実行が、g にアタッチするアプリ ローカルで定義されたクラス インスタンスを作成するアプリ ローカルで定義された preprocess_func を呼び出し、このローカルで定義されたクラス インスタンスが 'current_user' を使用することです...エラー。

_request_ctx_stack を使用してまだユーザーと連絡を取っていないか、ユーザーを削除する前に実行されます。乗算ポップまたは_request_ctx_stack.top.requestに触れることはおそらく「良くない」

2) 操作の順序。flask-security がユーザーを追加する前に、preprocess_request が実行されます。

3)手がかりがない、少し失われたATM

助言がありますか?

編集:

問題は、current_app.before_request_funcs が返すためのメソッド解決である可能性が最も高いです。

{None: [<function flarf_filter_request at 0x1a781b8>, <bound method LoginManager._load_user of <flask_login.LoginManager object at 0x1a79990>>, <bound method Principal._on_before_request of <flask_principal.Principal object at 0x1a80290>>]}

したがって、主なポイントは、私が間違っているということです. before_request 情報を取得する必要がある場合、フラスコがこれらの関数を実行する before_request 時間内にその情報を取得することは、現在 before_request 関数の順序付けがないため最適ではありません.

オプション?

  1. before_request 関数をフラスコに注文するオプションを追加します。おそらく優先キーワードと同じくらい簡単で、並べ替えられた辞書または並べ替えられた辞書を呼び出します

  2. 私がやっていることで戦術を変更します。たとえば、これを before_request からデコレータに変更します。しかし、それにはビューごとの表記が必要であり、青写真と拡張機能を作成する全体的なポイントは、ビューごとに特定の情報を収集する必要をなくすことでした。利点は、計画されていた複数のフィルターです。

  3. 便利な既製のソリューション: Flask-Classy


4

1 に答える 1

1

ちょっと私もこれに遭遇しましたが、Djangoではまったく同じエラーです。だから、これも似てるかなと思いました。RequestContext はリクエストではありませんが、含まれています。これはdjangoの特別なクラスであり、ビューによって作成されると、ビューからテンプレートに渡す他のすべてのコンテキスト変数とともに実際にリクエストが含まれます。

作成方法は次のとおりです。

c = RequestContext(request, {
    'foo': 'bar',
})

詳細はこちら。そしてフラスコのドキュメントで。

簡単に言うと、RequestContext は「request」キー内にリクエストを含む dict です。したがって、次のようにアクセスできます。

request = context['request']
user = request.user

テンプレートで、通常どおり request にアクセスすると、request.user が機能するはずです。これが役に立てば幸いです。これは Flask と Django で似ていると感じています。これで問題が解決しない場合は、コンテキストを印刷して、含まれているデータを確認できます。それが私が自分の問題を理解した方法です。

乾杯

于 2014-10-09T16:12:19.773 に答える