多方式登入介面
#--->傳到後端(post)-->根據傳入的校驗使用者名稱和密碼---》簽發token,使用者名稱,頭像
外掛程式
pip install djangorestframework-jwt
user/serializer.py
from rest_framework_jwt.settings importapi_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
classloginview(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...