一、生成项目及项目环境
- 使用开发工具: Pycharm
- 开发环境:
asgiref 3.2.7
Django 3.0.7
django-cors-headers 3.3.0
django-rest-framework 0.1.0
djangorestframework 3.11.0
pip 19.0.3
pytz 2020.1
setuptools 40.8.0
sqlparse 0.3.1
3.项目创建
-
使用Pycharm创建项目,项目名称为“django_test”
-
创建之后在下方Terminal 创建一个新的‘app’,名为api,命令如下: python manage.py startapp api
展示图如下:
-
项目创建完成,结构如下图所示
-
创建完成后要下载django-rest-framework框架,在下方Terminal输入: pip install django-rest-framework即可
-
然后在django_test目录下的settings.py文件中进行配置,在INSTALLED_APPS中添加'rest_framework'和'api',如下图所示
-
到此为止,项目已经创建好了
二、数据库设计
设计思路
主要是建两个表,用来存储用户注册信息
程序代码
from django.db import models
class UserInfo(models.Model):
USER_TYPE = (
(1,'普通用户'),
(2,'VIP'),
(3,'SVIP')
)
user_type = models.IntegerField(choices=USER_TYPE, default=1)
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
token = models.CharField(max_length=64)
注意: 在创建完模型后,要在Terminal执行数据库命令
python manage.py makemigrations
python manage.py migrate
三、视图构建
在api文件下的views.py文件中进行创建视图函数,具体代码如下
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication
from rest_framework.utils import json
from rest_framework.views import APIView
from api import models
def md5(user):
import hashlib
import time
# 当前时间,相当于生成一个随机的字符串
ctime = str(time.time())
# token加密
m = hashlib.md5(bytes(user, encoding='utf-8'))
m.update(bytes(ctime, encoding='utf-8'))
return m.hexdigest()
class AuthView(View):
def get(self, request, *args, **kwargs):
a=models.UserInfo.objects.all()
d=a.values()
return HttpResponse(d)
def post(self, request):
ret = {'code': 1000, 'msg': None}
try:
str = json.loads(request.body)
user = str.get('username')
pwd = str.get('password')
obj = models.UserInfo.objects.filter(username=user).first()
if not obj:
# 如果用户第一次登陆则创建用户
obj = models.UserInfo.objects.create(username=user, password=pwd)
ret['code'] = 1001
ret['msg'] = '创建用户成功'
# 为用户创建token
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)
四、路由配置
在django_test目录下的urls.py文件中进行配置。
添加如下代码:
url(r'^api/v1/auth/$', AuthView.as_view()),
五、测试
添加新的数据
结果如下
六、认证
假如用户想获取自己的订单信息,发送请求之后返回订单信息以json格式的数据返回。在api文件下的views.py文件中添加如下代码:
ORDER_DICT = {
1:{
'name':'apple',
'price':15
},
2:{
'name':'狗子',
'price':100
}
}
class FirstAuthenticate(BaseAuthentication):
# 添加自己的认证逻辑,基类BaseAuthentication中有一个必须要重写的接口
def authenticate(self, request):
pass
def authenticate_header(self, request):
pass
class MyAuthenticate(BaseAuthentication):
# 添加自己的认证逻辑,基类BaseAuthentication中有两个必须要重写的接口
def authenticate(self, request):
token = request._request.GET.get('token') # 获取token参数
token_obj = models.UserToken.objects.filter(token=token).first() # 在数据库UserToken查找是否有相应的对象
if not token_obj: # 如果没有,则报错
raise exceptions.AuthenticationFailed('用户认证失败')
return (token_obj.user, token_obj) # 这里需要返回两个对象,分别是UserInfo对象和UserToken对象
def authenticate_header(self, request): # 返回相应头信息
pass
class OrderView(APIView):
# 用户想要获取订单,就要先通过身份认证、
# 这里的authentication_classes 就是用户的认证类
authentication_classes = [FirestAuthenticate, MyAuthenticate]
def get(self, request, *args, **kwargs):
ret = {
'code': 1024,
'msg': '订单获取成功',
}
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)
测试结果如下:
- 带有token值的验证
2.不带token值得验证
关注公众号Python做些事,发送drf认证即可获取完整项
博主开通了微信公众号 “python做些事” 系统学习python和AI知识,