zoukankan      html  css  js  c++  java
  • 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知识,

  • 相关阅读:
    C++学习 之 继承(笔记)
    C++学习 之 类中的特殊函数和this指针(笔记)
    C++学习 之 类的声明及成员的访问(笔记)
    C++学习 之 指针及动态内存分配(笔记)
    C++学习 之 函数的重载及内联(笔记)
    C++学习 之 控制程序流程 (笔记)
    pkg-config too old的解决方法
    编译中出现的undefined reference to XXX
    sourceInsight下标题栏显示文件完整路径
    linux下 sleep() 与 usleep()
  • 原文地址:https://www.cnblogs.com/qiujichu/p/13048678.html
Copyright © 2011-2022 走看看