一:CBV模式&FBV模式

  • FBV【Function Base Views】—基于函数的views
  • CBV【Class Base Views】—基于类的views

    1:FBV模式

  • 代码实现方式

    1. from django.shortcuts import render,HttpResponse
    2. import json
    3. from zhylbwg.models import loginModels
    4. from zhylbwg.views import md5 # 导入自定义md5加密函数
    5. from zhylbwg.views import requestResult # 导入自定义的统一返回函数
    6. def register(request):
    7. # 判断是否为post请求
    8. if request.method == "POST":
    9. # 获取请求头数据,请求以json的格式传输
    10. registerinformation = request.body
    11. # 将请求头数据转化为json格式
    12. registerinformationData = json.loads(registerinformation)
    13. print(registerinformationData)
    14. # 获取用户名
    15. userName = registerinformationData.get('userName')
    16. # 从数据库中查找是否存在该用户名
    17. userNameDB = loginModels.Userinfo.objects.filter(userName=userName)
    18. # 判断用户名是否存在,若存在,则提示已有该用户,若不存在,则进行密码加密后存储到数据库中
    19. if userNameDB:
    20. return HttpResponse(json.dumps(requestResult.result_json('312', '该用户名已经存在', '')),
    21. content_type="application/json,charset=utf-8")
    22. else:
    23. # 获取用户密码
    24. #
    25. userPwd = registerinformationData.get('userPwd')
    26. # 密码加密操作md5,md5加密功能具体看md5加密代码
    27. userPwdMd5 = md5.Md5(userPwd)
    28. # 将加密后的密码赋值给请求头中的密码参数
    29. registerinformationData["userPwd"] = userPwdMd5
    30. # 将json格式数据,类型为dict 存储到数据库中,表明为Userinfo,将注册请求存储到数据库中
    31. loginModels.Userinfo.objects.create(**registerinformationData)
    32. return HttpResponse(json.dumps(requestResult.result_json('201', '注册成功,请登录', '')),
    33. content_type="application/json,charset=utf-8")
    34. else:
    35. return HttpResponse(json.dumps(requestResult.result_json('501', '不是post请求', '')),
    36. content_type="application/json,charset=utf-8")
  • url路径写法

    1. path('zhylbwg/register/', login.register),
    2. path('zhylbwg/login/', login.login),

    2:CBV模式

  • 代码实现方式
    ```python

    -- coding: utf-8 --

    ‘’’=================================== @Project:wisdomShop @Author:班婕妤 @Date:10/3/2020 下午2:14 @Company:深圳市智慧养老宝科技有限公司 @Motto:心有猛虎,细嗅蔷薇 @Python_Version:3.7.3 @Django_Version:2.1.5 =======================================’’’ from django.shortcuts import render from django.http import JsonResponse from rest_framework.views import APIView from rest_framework.decorators import api_view from zhylbwg.models.auth import auth_models from zhylbwg.util.MySchemaGenerator import DocParam from zhylbwg.views import md5 from django.views import View from zhylbwg.models import loginModels ‘’’ 用户验证,当用户首次登录时随机生成一个token ‘’’

    CBV 视图模式

    CBV 视图模式必须继承View,此处APIView 已经继承了View

    class AuthView(APIView): ‘’’

    1. post
    2. 为用户生成token的方法

    ‘’’ authentication_classes = [] permission_classes = [] coreapi_fields = (

    1. DocParam(name="username", location='body', description='用户姓名'),
    2. DocParam(name="password", location='body', description='用户密码'),

    )

    def post(self, request, args, *kwargs):

    1. ret = {'code': 1000, 'msg': None}
    2. try:
    3. user = request.POST.get('username')
    4. pwd = md5.Md5(request.POST.get('password'))
    5. obj = loginModels.Userinfo.objects.filter(userName=user, userPwd=pwd).first()
    6. if not obj:
    7. ret['code'] = 1001
    8. ret['msg'] = '用户名或密码错误'
    9. # 为用户创建token
    10. token = md5.Md5(user)
    11. # 存在就更新,不存在就创建
    12. loginModels.UserToken.objects.update_or_create(user=obj, defaults={'token': token})
    13. ret['token'] = token
    14. except Exception as e:
    15. ret['code'] = 1002
    16. ret['msg'] = '请求异常'
    17. return JsonResponse(ret)
  1. - url路径写法
  2. ```python
  3. path('zhylbwg/per/admin/', AuthView.as_view() ), # 生成token

- CBV注意事项

  • as_view()方法创建类实例
    首先 CBV 需要继承自 View 类所以需要使用如下方式进行导包··

    1. from django.views import View

    在 FBV 模式中 Django 的 URL 将一个请求分配给可调用的函数的即 login_fbv(),那么基于类的视图函数这种方式就不再适用了,URL 无法将一个请求分发给类去处理。针对这个问题,CBV 提供了一个 as_view() 静态方法,调用这个方法就会创建一个类的实例。

  • dispatch()分发函数

通过实例自动调用 CBV 内置 dispatch() 方法,我们把 dispatch() 方法看做一个分发函数,它会根据不同的请求方法调用相应的get()或者post()来进行处理。同样 CBV 模式也需要接受一个 HttpRequest对象即 request,最终返回一个 response 。如果想了解 dispatch()函数可以通过源码进行了解,它的主要作用就是实现请求的分发。