Django - decorators


decorators.py

  • プロジェクトで使用するデコーダコード
  • import jwt
    
    from django.http.response import JsonResponse
    
    from .models              import User
    import my_settings
    
    def login_required(func):
        def decorator(self, request, *args, **kwargs):
            try:
                access_token  = request.headers['Authorization']
                decoded_token = jwt.decode(access_token, my_settings.SECRET['secret'], algorithms='HS256')
    
                user = User.objects.get(id=decoded_token['user_id'])
                
                request.user = user
                return func(self, request)
    
            except User.DoesNotExist:
                return JsonResponse({'message':'UNKNOWN_USER'}, status=400)
    
            except KeyError:
                return JsonResponse({'message':'KEY_ERROR'}, status=400)
    
            except jwt.DecodeError:
                return JsonResponse({'message':'INVALID_TOKEN'}, status=400)
                
        return decorator

  • これまで登録レコーダは作成されてきたが,個別コードの作成の意味を完全に理解しているわけではない.今回、私はコードを行ごとに計算して、レコーダを書いて、いくつかの漏れた場所を発見して整理しました.

  • decorator関数のパラメータはselfとrequestを同時に入力する必要があります.

  • decorator関数はクラス内部で定義されていないため、selfを入力する必要はないと考えられます.ただし、selfを最初のパラメータとしてrequestと入力しないと、requestパラメータ値は正常に受け入れられません.

  • さらに、パラメータとして受信した関数を実行するコードreturn func(self, request)のパラメータselfの値は、def decorator(self, request, *args, **kwargs):のパラメータselfの値で定義されており、パラメータとして「self」を指定しなければ、パラメータとして受信した関数を実行することはできない.結論としては、正確な理由はわかりませんが…装飾モジュールではselfパラメータが必要です.

  • jwt.DecodeError vs json.JSONDecodeError
  • Except jwt.DecodeError::jwtモジュールで生成されたトークンを復号する際に発生する可能性のあるエラーを異常処理するために使用される.
  • Except json.DecodeError::HTTP要求本文に含まれるJSONデータ読み出し中に発生したエラーを処理するために使用される.