このようなシナリオでは、decorators
を使用できます。デコレータは、引数として別のメソッドを受け入れるメソッドです。あなたがしなければならないのは、pass the get/post or any other methods together with its arguments to decorator
です。それから、電子メールの確認/アカウントの有効を確認してください。
from functools import wraps
from .permissions import is_admin_or_manager
from .utils import get_user_on_user_identifier
def is_manager(method):
@wraps(method)
def wrapper(self, *args, **kwargs):
user_identifier = kwargs.get('user_identifier') if kwargs.get('user_identifier') else args[0]
user = get_user_on_user_identifier(user_identifier)
if user:
if is_admin_or_manager(user):
return method(self, *args, **kwargs)
else:
return {'status': 403, 'description': 'Only Manager/Admin roles can create items.'}
else:
return {'status': 404, 'description': 'No user with given username/email exists.'}
return wrapper
class PermissionException(Exception):
pass
そして、あなたの意見では、上記のコード
class Home(View):
@is_manager
def get(self, request):
...
はデコレータの使用法に例示しています。あなたの場合は、argsでメソッドを渡します。リクエストargからユーザーをデコレータに渡し、メールが確認されたかどうか/アカウントがアクティブになっているかどうかを確認します。メッセージを返信しない場合は、django messages framework json/stringを使用してメッセージを渡すこともできます。
クラスベースのビューで同じものを使用したい場合は、mixinsと考えてください。メソッドdispatch(self, request, *args, **kwargs)
を無効にすることができます。デコレータ/ミックスインの使用は、コードの1行で書いたすべてのビューに対してチェックを行うので、より効果的です。
フィールド 'is_confirmed'を追加できないのはなぜですか? –
@vishes_shellはい、どこに追加すればいいですか、ログインロジックに実装する方法はありますか? – overflow