- 首页 > it技术 > >
Django|Django rest framework 框架2
- 安装
pip install djangorestframework
- 内容
- 1.认证
1.1 有些API需要用户登录认证后才能访问,有些不需要
# model.py 创建表
from django.db import modelsclass UserInfo(models.model):
user_type_choices = (
(1, '普通用户',
2, 'VIP用户',
3, 'SVIP用户',
)
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharField(max_length=32, unique=True)
password = models.CharField(max_length=32)class UserToken(models.Model):
user = models.OneToOneFiled(to='UserInfo')
token = models.CharField(max_length=64)
1.2 迁移到数据库:python manage.py makemigrations
、python manage.py migrate
1.3 URL路径
# 项目目录下url
from django.config.urls import url
from django.contrib import admin
from api import viewsurlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/auth/$', views.AuthView.as_view()),
url(r'^api/v1/order/$', views.OrderView.as_view()),
]
1.4 视图CBV,登录,登录认证
from rest_framework.views import APIview
from django.http import JsonResponse
from api import modles
from rest_framework import exceptions
from rest_framework.authentication import BasicAuthentication# 生成随机字符串
def md5(user):
import hashlib
import time
ctime = str(time.time())
m = hashlib.md5(bytes(user, encoding='utf-8'))
m.update(bytes(ctime, encoding='utf-8'))
return m.hexdigest()ORDER_DICT = {
1:{
'name': 'xxx',
'age': 18,
},
2:{
'name': zzzz',
'age': 19,
}
}
# 实现认证的类
class Authtication(object):
def authenticate(self, request):
request._request.GET.get('token')
token_obj = models.UserToken.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFailed('用户认证失败')
# 在 reset framework内部将这两个字段赋值给了request。以供后续操作使用
return (token_obj.user, token_obj)def authenticate_header(self, request):
passclass AuthView(APIView):
"""
用户登录
"""
def post(self, request, *args, **kwargs):
ret = {'code': 1000, 'msg': None}
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'] = '用户名或密码不正确'
# 为登录用户创建token
token = md5(user)
# 没有token就创建,有就更新
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):
"""
订单处理相关业务
"""
# 使用认证
authentication_classes = [Authtication, ]def get(self, request, *args, **kwargs):
ret = {'code': 1000, 'msg': None, 'data': None}
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)
全局认证配置:
在settings.url
中添加,可配置未登录用命名及认证规则,未登录TOKEN
REST_FRAMEWORK = {"DEFAULT_AUTHENTICATION_CLASSES":['api.utils.auth.Authentication', ], 'UNAUTHENTICATED_USER': lambda : "游客", ''UNAUTHENTICATED_TOKEN': None, }
所有认证类在utils文件夹下,auth.py中,局部不需要使用认证可添加authentication_classes = []
内置认证类
1.认证类必须继承: from rest_framework.authentication import BaseAuthentication
实现authenticate
方法,返回值有3个,None:让下一个认证来处理,若抛异常,raise exceptions.AuthenticationFailed('用户认证失败')
,去from rest_framework import exceptions
导入。(元素1,元素2):元素1赋值给request.user
,元素2赋值给request.auth
2.其他认证类:BasicAuthentication
文章图片
图片.png
- 2.权限
2.1
文章图片
图片.png
- 【Django|Django rest framework 框架2】3.节流(访问频率控制)
3.1
文章图片
图片.png
3.2 基本使用
文章图片
图片.png
3.3 局部使用
文章图片
图片.png
3.4 全局使用
文章图片
图片.png
- 4.版本
4.1 数据库表
文章图片
图片.png
版本可以在URL中通过GET传参
文章图片
图片.png
视图函数中使用:
文章图片
图片.png
路由配置:
文章图片
图片.png
全局配置:
文章图片
图片.png
总结:
文章图片
图片.png
- 5.解析器
文章图片
图片.png
文章图片
图片.png
- 6.序列化
-
QuerySet进行序列化
文章图片
图片.png
文章图片
图片.png
文章图片
图片.png
文章图片
图片.png
文章图片
图片.png
-
请求数据进行校验
文章图片
图片.png
- 分页
- 路由
- 视图
- 渲染器
推荐阅读