1.项目app01 models.py django.db輸入モデルから AbstractUser django.contrib.auth.modelsからのインポート #ここにあなたのモデルを作成します。 クラスのUserProfile(AbstractUser): "" " 用户 """ 名前= models.CharField(max_lengthを= 30、ヌル= Trueの場合、空白=真、verbose_name = "姓名") の誕生日= models.DateField(ヌル= Trueの場合、空白=真、verbose_name = "出生年月") 性別= models.CharField(max_lengthを= 6、選択肢=(( "男性"、U "男")、( "女性"、 "女"))、デフォルト= "女性"、 verbose_name = "性别") モバイル= models.CharField(ヌル= Trueの場合、空白=、MAX_LENGTH = 11、verbose_name =真"电话" 、電子メール= models.EmailField(max_lengthを= 100、ヌル= Trueの場合、空白=真、verbose_name = "邮箱" verbose_name_plural = verbose_name デフ__str __(自己): 戻りますself.username serializers.py序列化文件 # - * -コーディング:UTF-8 - * - __author__ = 'hyh' django.contrib.auth輸入get_user_modelから rest_framework輸入シリアライザから ユーザー= get_user_model() クラスUserProfileSerializer(serializers.ModelSerializer): クラスのメタ: モデル=ユーザー・ フィールド= "__all__" 2.安装djangorestframework-JWT ピップはdjangorestframework-JWTインストール 配置の設定文件 添加如下配置 輸入日時 REST_FRAMEWORK =を{ 'DEFAULT_AUTHENTICATION_CLASSES'( #'rest_framework_jwt.authentication.JSONWebTokenAuthentication'、#全局设置 'rest_framework.authentication.BasicAuthentication'、 'rest_framework.authentication.SessionAuthentication' ) } JWT_AUTH = { 'JWT_EXPIRATION_DELTA':datetime.timedelta(日= 7 )、 'JWT_AUTH_HEADER_PREFIX': 'JWT' } AUTH_USER_MODEL = 'app01.UserProfile' #は、自定义用户表 AUTHENTICATION_BACKENDS =( #1将バックエンド添加进設定 'app01.views.CustomBackend'を ) view.py django.shortcutsインポートからレンダリング django.contrib.authから。バックエンドは、インポートModelBackend rest_frameworkインポートビューセットから からrest_frameworkインポートミックスイン rest_frameworkインポート認証から rest_framework_jwt.authenticationインポートJSONWebTokenAuthenticationから rest_framework_jwt.serializersからjwt_encode_handlerをインポートし、jwt_payload_handler django.contrib.auth輸入get_user_modelから .serializersからはUserProfileSerializerをインポート django.db.modelsからQインポート rest_frameworkの輸入状況から rest_frameworkからを。ビューはAPIViewをインポート rest_framework.responseインポートレスポンスから .modelsからのUserProfileをインポート django.http輸入JsonResponseから にisAuthenticatedインポートするrest_framework.permissionsから rest_framework輸入許可から app01.utils.permissionsからIsOwnerOrReadOnlyインポート #ここにあなたの意見を作成します。 ユーザー= get_user_model() クラスCustomBackend(ModelBackend): "" " 自定义用户验证 """ defの認証(自己、ユーザ名=なし、パスワード=なし、** kwargsから): 試してください: ユーザー= UserProfile.objects.get(Q (ユーザー名=ユーザー名)| Q(モバイル=ユーザー名)) であればuser.check_password(パスワード): リターン・ユーザー の電子などの例外を除い: なし戻り クラスUserViewset(mixins.CreateModelMixin、mixins.UpdateModelMixin、mixins.RetrieveModelMixin、mixins.ListModelMixin、ビューセットを.GenericViewSet): クエリセット= UserProfile.objects.all() #permission_classes =(にisAuthenticated、IsOwnerOrReadOnly)#权限和认证必须同时使用、否则认证不生效 authentication_classes =(JSONWebTokenAuthentication、authentication.SessionAuthentication) デフget_serializer_class(自己): self.actionは== "検索"場合: UserProfileSerializer返し ELIF自己を。アクション== "作成": UserProfileSerializerが返す UserProfileSerializer返す #permission_classes =(permissions.IsAuthenticated、) :デフget_permissions(自己) self.action場合== "検索": 戻る[permissions.IsAuthenticated()] ELIFのself.actionを== "作成": 返す[] 戻る[] :デフ(自己、要求、* argsを、** kwargsから)作成 シリアライザ= self.get_serializer(データ= request.data) serializer.is_valid(RAISE_EXCEPTION = TRUE) 、ユーザ= self.perform_create(シリアライザ) re_dict =シリアライザを。データ ペイロード= jwt_payload_handler(ユーザ) re_dict [ "トークン"] = jwt_encode_handler(ペイロード) re_dict [ "名前"] = user.name場合user.name他user.username ヘッダー= self.get_success_headers(serializer.data) リターン応答(re_dictステータス= status.HTTP_201_CREATED、ヘッダー=ヘッダ) DEF GET_OBJECT(自己): 戻りself.request.user DEF perform_create(自己、シリアライザ)。 リターンserializer.save() クラスインデックス(APIView): permission_classes =(にisAuthenticated、IsOwnerOrReadOnly) authentication_classes =(JSONWebTokenAuthenticationが、) デフを取得(自己、リクエスト): JsonResponse({ "インデックス"を返します。」 OK "}) 3.urls.py django.contribインポート管理者から django.urlsインポートパスから django.conf.urls輸入されたURLから、含ま rest_framework.routersからSimpleRouter、defaultrouterにをインポート rest_framework.documentationインポートinclude_docs_urlsから app01.viewsインポートからUserViewset、インデックス rest_framework_jwt.viewsからobtain_jwt_tokenインポート ルータ= SimpleRouterを() router.register( 'ユーザ'、UserViewset、BASE_NAME = 'useruinfo') クラス IsOwnerOrReadOnly(permissions.BasePermission):""」 オブジェクトレベルの権限は、オブジェクトの所有者がそれを編集できるようにします。) Urlpatterns = [ パス( '管理/'、admin.site.urls)、 URL(R '^ API-AUTH /'( 'rest_framework.urls'、ネームスペース= 'rest_framework')を含む)、 URL(r'docs /」、include_docs_urls (タイトル= "ユーザー信息"))、 URL(R '^ログイン/')、obtain_jwt_token、 URL(R '^インデックス/'、Index.as_view())、 ] urlpatterns + = router.urls 4.在app01下创建utilsの目录、permissions.py文件存放 permissions.py文件内容 # - * -コーディング:UTF-8 - * - __author__ = 'hyh' rest_framework輸入許可からは、 モデルインスタンスが`owner`属性を持っていると仮定します。 ""」 デフhas_object_permission(自己、リクエスト、ビュー、OBJ): #私たちは常にGET、HEADやOPTIONS要求を許可します。 permissions.SAFE_METHODSにrequest.method場合: Trueを返し owner` `という名前の属性を持っている必要があります#インスタンスを。 リターンobj.user ==からrequest.user 4.测试 获取トークン
トークンをコピーします
リターン結果成功