Django-rest-framwork——认证

一、生成项目及项目环境

  1. 使用开发工具: Pycharm
  2. 开发环境:

	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.项目创建

  1. 使用Pycharm创建项目,项目名称为“django_test”

  2. 创建之后在下方Terminal 创建一个新的‘app’,名为api,命令如下: python manage.py startapp api
    展示图如下:

  3. 项目创建完成,结构如下图所示

  4. 创建完成后要下载django-rest-framework框架,在下方Terminal输入: pip install django-rest-framework即可

  5. 然后在django_test目录下的settings.py文件中进行配置,在INSTALLED_APPS中添加'rest_framework'和'api',如下图所示

  6. 到此为止,项目已经创建好了

二、数据库设计

设计思路

主要是建两个表,用来存储用户注册信息

程序代码

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)

测试结果如下:

  1. 带有token值的验证

2.不带token值得验证


关注公众号Python做些事,发送drf认证即可获取完整项

博主开通了微信公众号 “python做些事” 系统学习python和AI知识,

原文地址:https://www.cnblogs.com/qiujichu/p/13048678.html