美文网首页
Django rest framework 框架2

Django rest framework 框架2

作者: xinmin | 来源:发表于2019-05-04 15:53 被阅读0次
    • 安装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 makemigrationspython 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)
        

        全局认证配置:

        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
      • 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
      • 分页

      • 路由

      • 视图

      • 渲染器

    相关文章

      网友评论

          本文标题:Django rest framework 框架2

          本文链接:https://www.haomeiwen.com/subject/zxsmlqtx.html