2

ブループリントで次の基本認証デコレーターを使用したいと考えています。

def requires_auth(func):
    @wraps(func)
    def decorated(*args, **kwargs):
        request_auth = request.authorization
        if not request_auth or not auth.authenticate(request_auth.username, request_auth.password):
            return api.response_auth_failed()
        return func(*args, **kwargs)
    return decorated

そして青写真では:

@bp.route("/")
@requires_auth
def root():
  return "root"

ただし、モジュールが構成にアプリを使用するflask_peewee.authため、アプリ インスタンスを必要とする db インスタンスも必要とするモジュールに依存しています。Database()

db = Database(app)
auth = Auth(app, db)

以前は、これらすべてを 1 つのファイルでインスタンス化することでアプリケーションがよりシンプルになったときに、これを機能させていましたapp.pyが、今はもう少し整理したいと考えています。

db.Model定義と上記のrequires_authデコレータを別のファイル (db_models.pyモジュールなど)に移動し、requires_authデコレータを個々のブループリント定義にインポートすることは可能ですか? appオブジェクトを作成するためにオブジェクトにアクセスする必要がある場合、どうすればよいdbですか?


編集: アプリを次のように再編成しました: http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/requires_auth関数を入れました私のauth.pyモジュールはインポートして使用できますview.pyが、設計図の 1 つにインポートしようとすると失敗します。認証モジュールがアプリ モジュールをインポートし、ブループリントがアプリ モジュールを拡張しているため、循環インポートを取得しているためだと思います。何か案は?

4

1 に答える 1

3

ご指摘のとおり、問題はモジュール構成にあると思います。を含むデコレータ モジュールを作成するとどうなりますrequires_authか?

次に、次のようにインポートを構造化します。

  1. app.py (アプリとデータベースのインスタンス化)
  2. auth.py (認証のインスタンス化、app.py からのインポート)
  3. api.py (API のインスタンス化、app.py からのインポート)
  4. decorators.py (requires_auth を定義し、auth および api からインポート)
  5. blueprints/views.py (app.py、auth.py、api.py、decorators.py からのインポート)
  6. main.py (アプリ、認証、API、デコレータ、ブループリントをインポート) は、アプリケーションのエントリ ポイントです。
于 2013-12-16T17:01:20.047 に答える