django通過使用jwt模塊實現狀態保持


 

第一步:安裝jwt

pip install djangorestframework-jwt

 

第二步:settings/dev的配置文件配置

REST_FRAMEWORK = {
    # 認證配置
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}

解釋:定義drf配置全局默認的認證方案

 

第三步:

JWT_AUTH = {
    # 重新定義jwt認證成功后返回的數據
    'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  #定義token過期時間為一天
}

解釋:第一個參數,重新定義jwt認證成功后返回的數據(jwt默認只返回token,我們在users.utils 下定義該類認證成功后 增加返回字段信息)

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定義jwt認證成功返回數據
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }

 

第四步:因為jwt 只對用戶名進行認證,我們重寫認證方式,增加手機號認證,上代碼:

setting.py繼續配置:

#在配置文件中告知Django使用我們自定義的認證后端
AUTHENTICATION_BACKENDS = [
    'users.utils.UsernameMobileAuthenticate',
]

user.utils下自定義類重寫認證方式:

from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q
class UsernameMobileAuthenticate(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = User.objects.get(Q(username=username)|Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None

第五步:登錄時post請求url設置:

from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^login/$',obtain_jwt_token),
  ]

是不是很厲害,就這樣我們就可以完成登錄校驗

 


 

下面上個例子,注冊成功后后台生成token 並返回前端,用戶直接登錄即可

注冊時 創建用戶序列化器增加字段:

 
         
from rest_framework_jwt.settings import api_settings     #導入該模塊

class
CreateUserSerializer(serializers.ModelSerializer):
token
= serializers.CharField(label='登錄狀態token', read_only=True) # 增加token字段    username = ...
   password = ... 
''''''

user = super(CreateUserSerializer,self).create(validated_data)
user.set_password(validated_data['password'])
user.save()

# 補充生成記錄登錄狀態的token

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

# 將token保存到user對象中,隨着返回值返回給前端
user.token = token
return user
 
        

注:以上代碼是獲取token 生成token 

我們再來看看前端接收,

LocalStorage.token=response.data.token
sessionStorage.token=response.data.token

#我們將后台返回的token 保存在本地或者session即可:

然后我們請求后台是請求體攜帶即可:

這樣當我們登錄成功后 ,我們后台 request,user 就可以輸出當前用戶是誰

這些都是jwt  為我們做的很多事情。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM