前言
現在很多接口項目在登錄的時候返回一個token,登錄后的拿着這個token去訪問訪問登錄之后的請求。
本篇使用djangorestframework框架寫一個登陸的接口,登錄成功后返回token。
環境准備:
python 3.6
django 2.1.2
TokenAuthentication
django rest framework權限和認證有四種方式:
- BasicAuthentication 此身份驗證方案使用HTTP基本身份驗證,根據用戶的用戶名和密碼進行簽名。基本身份驗證通常僅適用於測試
- TokenAuthentication 此身份驗證方案使用基於令牌的簡單HTTP身份驗證方案。令牌認證適用於客戶端 - 服務器設置,例如本機桌面和移動客戶端。
- SessionAuthentication 此身份驗證方案使用Django的默認會話后端進行身份驗證。會話身份驗證適用於與您的網站在同一會話上下文中運行的AJAX客戶端。
- RemoteUserAuthentication 此身份驗證方案允許您將身份驗證委派給Web服務器,該服務器設置REMOTE_USER 環境變量。
本篇講TokenAuthentication這種認證方式,先安裝對應的模塊
pip install djangorestframework
在setting.py中加入配置參數
INSTALLED_APPS = (
...
'rest_framework',
'rest_framework.authtoken',
)
添加REST_FRAMEWORK項,rest_framework.authentication.TokenAuthentication
上面說的第三種token認證的方式。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication', # token認證
)
}
同步數據庫,生成authtoken_token表
python manage.py migrate
執行完成后,數據庫里面就會多一張authtoken_token表
登錄生成token案例
登錄可以直接用django自帶的User表,所以不需要重新設計表了,登錄的賬號就是User表的數據,先准備幾個登錄的賬號,比如我的登錄賬號是test,密碼是123456
views.py編輯登錄的視圖函數
# views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.shortcuts import HttpResponse
from rest_framework.authtoken.models import Token
from django.contrib import auth
from rest_framework.views import APIView
# 作者:上海-悠悠,QQ交流群:750815713
class LoginViewSet(APIView):
'''登錄方法'''
def post(self, request, *args, **kwargs):
username = request.data.get('username')
password = request.data.get('password')
user = auth.authenticate(username=username, password=password)
if not user:
return JsonResponse({"code": 0,
"msg": "用戶名或密碼不對!"})
# 刪除原有的Token
old_token = Token.objects.filter(user=user)
old_token.delete()
# 創建新的Token
token = Token.objects.create(user=user)
return JsonResponse({"code": 0,
"msg": "login success!",
"username": user.username,
"token": token.key})
urls.py設置訪問地址
# urls.py
from apiapp import views
from django.conf.urls import url
# 作者:上海悠悠,QQ交流群:750815713
urlpatterns = [
url(r'^api/v1/login/$', views.LoginViewSet.as_view()),
]
測試登錄獲取token
接着測試登錄返回token的接口,使用post請求,請求類型Content-Type: application/json
測試結果
登錄成功后,token會寫入authtoken_token表里面
其它的接口需要登錄之后才能訪問,也就是token用戶認證下篇再講