認証および権限
された機能を実現したい今、登録着陸してください:のみログインしているユーザーは、動物のリストを表示することができ、何のログインユーザが権限を持っていません。
- 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())、 ]