- 安装
pip install djangorestframework
- 内容
-
1.认证
1.1 有些API需要用户登录认证后才能访问,有些不需要# model.py 创建表 from django.db import models class 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 views urlpatterns = [ 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): pass class 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)
全局认证配置:
在
图片.pngsettings.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
-
2.权限
2.1 图片.png
-
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
-
QuerySet进行序列化
图片.png
-
分页
-
路由
-
视图
-
渲染器
-
网友评论