ジャンゴRestframework.3

認証および権限

された機能を実現したい今、登録着陸してください:のみログインしているユーザーは、動物のリストを表示することができ、何のログインユーザが権限を持っていません。

  • Authentication.pyは、ファイル内のプロジェクトファイルで作成されました
django.core.cache インポートキャッシュ
 から rest_framework.authenticationの輸入BaseAuthentication 

から App.models 輸入ユーザ


クラス UserTokenAuthentication(BaseAuthentication): 继承自BaseAuthentication 

    デフ(自己、要求)を認証:
         試す
            トークン = request.query_params.get(" トークン" 
            USER_ID = cache.get(トークン)

            ユーザー = User.objects.get(PK = USER_ID)
             戻りユーザ、トークン    ユーザの要求に記憶されたトークン
        を除いてE AS例外:
             印刷(E)
  • 認証機能を追加することに対応する図で
クラスAnimalsAPIView(ListCreateAPIView):

    クエリセット = Animal.objects.all()
    serializer_class = AnimalSerializer 
    authentication_classes = UserTokenAuthentication、  要逗号、元组加形式
  • このときも、機能を実現することができない、あなたが許可を追加する必要があります
  • Permission.pyは、ファイル内のプロジェクトファイルで作成されました
rest_framework.permissionsがインポートBasePermission 

から App.models インポートユーザー


クラス:LoginPermission(BasePermission)BasePermissionから継承された

    DEFのhas_permission(セルフ、リクエスト、ビュー):
         返しでisinstance(からrequest.user、ユーザー)   #のユーザー決意を要求に格納されますないユーザーインスタンスそれがtrueを返す場合、特権ではなく、権利およびその逆もあります
  • あなたはそれがユーザー先の所属するユーザが作成した動物を達成したい場合は、モデルのより多くを必要とします
クラスアニマル(models.Model):

    a_name = models.CharField(max_lengthを= 16 #の指定されたデフォルトのモデル_set後に指定した名前に関連付けられているrelated_nameフィールドがあり、当社のrelated_name値 
    a_user = models.ForeignKey(ユーザー、related_name = " u_animals "
  • 連載
LASS AnimalSerializer(serializers.ModelSerializer):
    a_user = serializers.ReadOnlyField(ソース= " a_user.u_name " 

    クラスメタ:
        モデル = 動物
        フィールド =(" ID "" a_name "" a_user " 


クラスUserSerializer(serializers.ModelSerializer) :

    u_animals = AnimalSerializer(多くの=真、READ_ONLY = 真)

    クラスのMeta:
        モデル = ユーザー
        フィールド =(" ID "" u_name "" u_password "" u_animals "
    • ビュークラスのcreateメソッドを呼び出す場合、ソースコードは次のとおりです。
クラスCreateModelMixin(オブジェクト):
     "" " 
    モデルのインスタンスを作成します
    """ 
    defを作成する(自己、要求、* argsを、** kwargsから):
        シリアライザ = self.get_serializer(データ= request.data)
        serializer.is_valid(RAISE_EXCEPTION = 真)
        self.perform_create(シリアライザ)
        ヘッダ = self.get_success_headers(serializer.data)
         リターン・レスポンス(serializer.data、ステータス= status.HTTP_201_CREATED、ヘッダ= ヘッダ)

    デフperform_create(自己、シリアライザ):
        serializer.save()

    DEF get_success_headers (自己、データ):
        試すリターン { ' 場所' :STR(データ[api_settings.URL_FIELD_NAME])}
         を除いて(例外TypeError、KeyError例外):
             リターン {}
      • 実行時の配布はので、この機能を無効にするために、perform_create機能のうち、保存されました
  • クラスAnimalsAPIView(ListCreateAPIView):
    
        クエリセット = Animal.objects.all()
        serializer_class = AnimalSerializer 
        authentication_classes = UserTokenAuthentication、
        permission_classes = LoginPermission、
    
        DEF perform_create(自己、シリアライザ):
            serializer.save(a_user = self.request.user)

    その結果、対応する要求に格納されたユーザ情報、すなわち、ユーザのログイン時にフィールドが自動的に格納されるa_user

  • 現在のユーザーのみが削除見ることができ、変更を許可した場合、まだあなたには、権限を追加する必要があります
  • クラスLoginPermission(BasePermission):
    
        DEF :has_permission(自己、リクエスト、ビュー)
             リターンでisinstance(からrequest.user、ユーザ)
    
        デフhas_object_permission(自己、リクエスト、ビュー、OBJ):
             戻り request.user.u_animals.filter(PK = OBJ。 ID).exists()  返回偽或真

    obj.idルーティングパラメータ/動物/ 1 / obj.id = 1、すなわち 

  • ルーティングフォーム:

  • urlpatterns = [ 
        URL(R ' ^動物/(?P <PK> \ D +)/ ' 、views.AnimalAPIView.as_view())、
    ]

     

おすすめ

転載: www.cnblogs.com/zbcdamao/p/10990884.html