pythonで装飾器を使用してflaskユーザー権限を統一的にチェック

1676 ワード

最近、あるプロジェクトでrestfulインタフェース関数が入力されたときに、以前にログイン状態が特定のユーザーであるかどうか、およびそのユーザーに指定された権限があるかどうかを判断する必要があります.チェックしていない場合は、すぐにエラーを返し、機能を中断します.
マスクされたシーンは、標準的な呼び出し関数で操作することもできますが、装飾器を使うほど簡単ではありません.装飾器が使いやすいか書きにくいかはよく知られていますが、くだらないことは言わないで、まずこのシーンがどのように実現されているかを見てみましょう.やはり一定の汎用性があります.
def validate_current_is_admin(f):
    @functools.wraps(f)
    def decorated_function(*args, **kws):
        #          ,       admin       ,
        #     ,     ;
        if g.user.user_name != 'admin':
            raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)

        #         admin,     ,  401  
        if g.user.role_id != Permission.ADMIN:
            raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)

        return f(*args, **kws)

    return decorated_function

これは標準的な装飾器の書き方で、簡単な装飾器を書くなら、フレーム全体を参考にすることができます.
アクセラレータ呼び出しの例:
@app.route('/api/create_user', methods=['POST'])
@auth.login_required
@validate_current_is_admin
def create_user():

    #     
    user_name = request.json.get('user_name')
    password = request.json.get('password')
......

コアコードのビジネスロジックも複雑ではなく、flaskのgオブジェクトに予め保存されているユーザーuserに基づいて検査処理を行い、flaskのこれらの定義は非常に柔軟であり、flask.gがflaskのドキュメントを表示する方法をどのように使用するかを確認することができます.
ここでのuserおよび関連する属性は具体的なビジネスロジックに属し,解釈を展開せず,文生義を望むことができる.
一致しないことをチェックすると、カスタムflaskエラーが呼び出されます.このセクションでは、前に書いたpython flask書き込みapiがカスタムエラーを返す方法を確認できます.argsおよびkwsのパラメータは解析および処理されないため、flaskグローバルオブジェクトが処理される.最後にパラメータをすべて元のパスに持ち帰り、問題がなければ装飾器を使ったコードに渡して処理を続行します.
この例は比較的簡単で、主に装飾器の基本的な使い方を熟知している.