7

私はフラスコを初めて使用し、デコレータの強力な機能を使用しようとしています:p ここで多くのことを読んで、pythonデコレータに関するトピックをたくさん見つけましたが、実際には何も役に立ちませんでした。

@app.route('groups/<id_group>')
@group_required(id_group)
@login_required
def groups_groupIndex(id_group):
    #do some stuff
    return render_template('index_group.html')

これは私が得るエラーです:

@group_required(id_group), NameError: name 'id_group' is not defined

わかりました、id_group はまだ定義されていませんが、関数 groups_groupIndex では URL から id_group パラメータを使用できるのに、デコレータでは使用できない理由がわかりません!

デコレータを移動/切り替えようとしましたが、毎回同じエラーが発生しました。

ここに私のデコレータがありますが、うまくいくようです

def group_required(group_id):
    def decorated(func):
        @wraps(func)
        def inner (*args, **kwargs):
            #Core_usergroup : table to match users and groups
            groups = Core_usergroup.query.filter_by(user_id = g.user.id).all()
            for group in groups:
                #if the current user is in the group : return func
                if int(group.group_id) == int(group_id) :
                    return func(*args, **kwargs)
            flash(gettext('You have no right on this group'))
            return render_template('access_denied.html')     
        return inner
    return decorated

デコレータが表示されない可能性があります...この方法でデコレータを使用できますか、それとも別のものを書き直す必要がありますか?

4

1 に答える 1