这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
一、基本使用
版本使用方式:
1. 在url中传递版本:
如www.example.com/api?version… 和其他组建一样,我们在utils里面建立version.py,添加版本类
#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
class Myversion(BaseVersioning):
def determine_version(self, request, *args, **kwargs):
myversion=request.query_params.get('version')
return myversion
在订单视图中应用版本,(当然直接可以使用request.get获取)
class OrderView(APIView):
'''查看订单'''from utils.permissions import MyPremission
from utils.version import Myversion
authentication_classes = [Authentication,] #添加认证
permission_classes = [MyPremission,] #添加权限控制
versioning_class = Myversion #添加版本def get(self,request,*args,**kwargs):
print(request.version)#获取版本#当然使用request._request.get('version')也可以
ret = {'code':1000,'msg':"你的订单已经完成",'data':"买了一个mac"}
return JsonResponse(ret,safe=True)
models.py
from django.db import models
class UserInfo(models.Model):
user_type_choice = (
(1,"普通用户"),
(2,"会员"),
)
user_type = models.IntegerField(choices=user_type_choice)
username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(to=UserInfo)
token = models.CharField(max_length=64)
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^api/v1/auth', views.AuthView.as_view()),
url(r'^api/v1/order', views.OrderView.as_view()),
]
views.py
from django.shortcuts import HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.authentication import BaseAuthentication
from . import models
from rest_framework import exceptions
import hashlib
import time
class Authentication(BaseAuthentication):
"""
认证类
"""def authenticate(self, request):
token = request._request.GET.get("token")
toke_obj = models.UserToken.objects.filter(token=token).first()
if not toke_obj:
raise exceptions.AuthenticationFailed("用户认证失败")
return (toke_obj.user, toke_obj) # 这里返回值一次给request.user,request.authdef authenticate_header(self, val):
passdef md5(user):
ctime = str(time.time())
m = hashlib.md5(bytes(user,encoding="utf-8"))
m.update(bytes(ctime,encoding="utf-8"))
return m.hexdigest()
class AuthView(APIView):
"""登陆认证"""
def dispatch(self, request, *args, **kwargs):
return super(AuthView, self).dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
return HttpResponse('get')
def post(self, request, *args, **kwargs):
ret = {'code': 1000, 'msg': "登录成功"}
try:
user = request._request.POST.get("username")
pwd = request._request.POST.get("password")
obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
if not obj:
ret['code'] = 1001
ret['msg'] = "用户名或密码错误"else:
token = md5(user)
models.UserToken.objects.update_or_create(user=obj, defaults={"token": token})
ret['token'] = token
except Exception as e:
ret['code'] = 1002
ret['msg'] = "请求异常"return JsonResponse(ret)
class OrderView(APIView):
'''查看订单'''
from utils.permissions import MyPremission
from utils.version import Myversion
authentication_classes = [Authentication,] #添加认证
permission_classes = [MyPremission,] #添加权限控制
versioning_class = Myversion
def get(self,request,*args,**kwargs):
print(request.version)
ret = {'code':1000,'msg':"你的订单已经完成",'data':"买了一个mac"}
return JsonResponse(ret,safe=True)
使用postman发送请求:
http://127.0.0.1:8000/api/v1/order?token=7c191332ba452abefe516ff95ea9994a&version=v1, 后台可获取版本。
当然上面获取版本方式还有更为简单的获取版本方法,使用QueryParameterVersioning,其就是封装的以上过程。
class OrderView(APIView):
'''查看订单'''
from utils.permissions import MyPremission
from utils.version import Myversion
from rest_framework.versioning import QueryParameterVersioning
authentication_classes = [Authentication,] #添加认证
permission_classes = [MyPremission,] #添加权限控制 versioning_class = QueryParameterVersioning #该方法获取参数的key为versiondef get(self,request,*args,**kwargs):
print(request.version)
ret = {'code':1000,'msg':"你的订单已经完成",'data':"买了一个mac"}
return JsonResponse(ret,safe=True)
当然,DRF也提供了可配置的版本,并且还能控制版本使用 settings.py
REST_FRAMEWORK = {
#版本配置"DEFAULT_VERSION":'v1',
#默认的版本"ALLOWED_VERSIONS":['v1','v2'],
#允许的版本,这里只允许V1和v2"VERSION_PARAM":'version' ,
#get方式url中参数的名字 如?version=v1
}
使用postman验证,发送带token和版本http://127.0.0.1:8000/api/v1/order?token=7c191332ba452abefe516ff95ea9994a&version=v3
结果:
可见版本配置生效。
2. 使用url路径传递版本,
如www.example.com/api/v1,djan… rest framework 当然也为我们提供了类:URLPathVersioning
为了区分,这里新建url和view,如下:
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^api/v1/auth', views.AuthView.as_view()),
url(r'^api/v1/order', views.OrderView.as_view()),
url(r'^api/(?P<version>[v1|v2]+)/user', views.UserView.as_view()), # 新建的url
]
UserView
class UserView(APIView):
'''查看用户信息'''
from rest_framework.versioning import URLPathVersioning
versioning_class =URLPathVersioning
def get(self,request,*args,**kwargs):
print(request.version) #获取版本
res={"name":"wd","age":22}
return JsonResponse(res,safe=True)
使用postman请求:http://127.0.0.1:8000/api/v1/user ,同样后台能拿到版本结果。