20 多方式登入介面

2022-09-23 16:54:11 字數 3492 閱讀 2035

多方式登入介面

#

--->傳到後端(post)-->根據傳入的校驗使用者名稱和密碼---》簽發token,使用者名稱,頭像

外掛程式

pip install djangorestframework-jwt

user/serializer.py

from rest_framework_jwt.settings import

api_settings

jwt_payload_handler =api_settings.jwt_payload_handler

jwt_encode_handler =api_settings.jwt_encode_handler

from rest_framework_jwt.views import

obtain_jwt_token

class

loginserializer(serializers.modelserializer):

#如果不重寫username,username欄位自己的校驗規則就過不了

#如果不重寫,字段自己的校驗規則(從user表身上對映過來的),最長和最短,由於username是 unique的

username=serializers.charfield() #

字段自己的校驗規則就沒了

class

meta:

model =user

#往裡走--->反序列化校驗:username和password---》只是校驗長短

#往外走--->序列化---》username,icon

fields = ['

username

', '

password

', '

icon']

extra_kwargs =,

'icon

': }

def validate(self, attrs): #

全域性鉤子

#校驗使用者名稱和密碼是否正確,如果正確,簽發token,如果不正確,拋異常

#1 獲取登入使用者

user =self._get_user(attrs)

#2 簽發token--django-jwt

token=self._get_token(user)

#3 把token 放入到當前物件中給view用

self.context['

token

']=token

self.context[

'username

']=user.username

#self.context['icon']=user.icon # icon的有點問題,需要str(user.icon)

#這個位址是服務端位址,服務端位址從request物件中可以取出request.meta['http_host']

公司裡這麼寫,表示只在類內部用

#取出使用者的使用者名稱和密碼,校驗

username = attrs.get('

username

') #

可能是手機號,郵箱和使用者名稱

password = attrs.get('

password')

#正則匹配

if re.match(r'

^1[3-9][0-9]$

', username): #

手機號 user = user.objects.filter(mobile=username).first()

elif re.match(r'

^.+@.+$

', username): #

郵箱 user = user.objects.filter(email=username).first()

else

: user = user.objects.filter(username=username).first()

if user and

user.check_password(password):

#校驗密碼

return

user

else

:

raise validationerror('

使用者名稱或密碼錯誤')

def_get_token(self,user):

#根據user獲取payload

payload =jwt_payload_handler(user)

#根據payload得到token

token=jwt_encode_handler(payload);

return token

user/views.py

class

loginview(genericviewset):

queryset =user.objects.all()

serializer_class =loginserializer

@action(methods=['

post

'], detail=false, ) #

user/login/mul_login

defmul_login(self, request):

try:

#校驗規則和簽發token都寫到序列化類中

ser = self.get_serializer(data=request.data,context=)

ser.is_valid(raise_exception=true) #

走序列化類的字段自己的規則,區域性鉤子和全域性鉤子

token = ser.context.get('

token')

username = ser.context.get('

username')

icon = ser.context.get('

icon')

except

exception as e:

raise

apiexception(str(e))

return apiresponse(token=token, username=username, icon=icon)

urls.py

path('

login/

', views.loginview.as_view()),

多方登陸方式實現

先去資料庫查 如果使用者存在成功 去判斷一下 如果存在返回user obj物件 from django.contrib.auth import get user model usermodel get user model class class2003aaa modelbackend authen...

ubuntu 登入介面迴圈登入

用ubuntu安裝盤 usb 進入 選擇ubuntu試用模式 修改原ubuntu相關配置檔案。網上也有按照各種命令修改,但是我進入tty模式,始終不能正確執行,所以我才想到了這個辦法。昨天,我的ubuntu16.04在登入介面輸入密碼後,一直迴圈。後來用這個方法,進入之後,在試用ubuntu介面,輸...

VB登入介面的兩種實現方式

由於框架內容已基本完成,下面就可以做些業戶性質的任務了。首先是登入介面的設計,常見的登入介面有兩種 第一種設程式在開始執行時顯示乙個登入視窗,驗證正確後才可以進入程式中,如qq。vb實現 vb程式的啟動可以設定為從登入窗體啟動,即工程 工程屬性 啟動物件,選擇要啟動的窗體即可。我一般喜歡從sub m...