djangorestframework-JWTのユーザ認証トークン

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.测试
 获取トークン

image.png


トークンをコピーします

image.png


リターン結果成功

おすすめ

転載: blog.51cto.com/haoyonghui/2425999