一:CBV模式&FBV模式
- FBV【Function Base Views】—基于函数的views
CBV【Class Base Views】—基于类的views
1:FBV模式
代码实现方式
from django.shortcuts import render,HttpResponseimport jsonfrom zhylbwg.models import loginModelsfrom zhylbwg.views import md5 # 导入自定义md5加密函数from zhylbwg.views import requestResult # 导入自定义的统一返回函数def register(request):# 判断是否为post请求if request.method == "POST":# 获取请求头数据,请求以json的格式传输registerinformation = request.body# 将请求头数据转化为json格式registerinformationData = json.loads(registerinformation)print(registerinformationData)# 获取用户名userName = registerinformationData.get('userName')# 从数据库中查找是否存在该用户名userNameDB = loginModels.Userinfo.objects.filter(userName=userName)# 判断用户名是否存在,若存在,则提示已有该用户,若不存在,则进行密码加密后存储到数据库中if userNameDB:return HttpResponse(json.dumps(requestResult.result_json('312', '该用户名已经存在', '')),content_type="application/json,charset=utf-8")else:# 获取用户密码#userPwd = registerinformationData.get('userPwd')# 密码加密操作md5,md5加密功能具体看md5加密代码userPwdMd5 = md5.Md5(userPwd)# 将加密后的密码赋值给请求头中的密码参数registerinformationData["userPwd"] = userPwdMd5# 将json格式数据,类型为dict 存储到数据库中,表明为Userinfo,将注册请求存储到数据库中loginModels.Userinfo.objects.create(**registerinformationData)return HttpResponse(json.dumps(requestResult.result_json('201', '注册成功,请登录', '')),content_type="application/json,charset=utf-8")else:return HttpResponse(json.dumps(requestResult.result_json('501', '不是post请求', '')),content_type="application/json,charset=utf-8")
url路径写法
path('zhylbwg/register/', login.register),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): ‘’’
post:为用户生成token的方法
‘’’ authentication_classes = [] permission_classes = [] coreapi_fields = (
DocParam(name="username", location='body', description='用户姓名'),DocParam(name="password", location='body', description='用户密码'),
)
def post(self, request, args, *kwargs):
ret = {'code': 1000, 'msg': None}try:user = request.POST.get('username')pwd = md5.Md5(request.POST.get('password'))obj = loginModels.Userinfo.objects.filter(userName=user, userPwd=pwd).first()if not obj:ret['code'] = 1001ret['msg'] = '用户名或密码错误'# 为用户创建tokentoken = md5.Md5(user)# 存在就更新,不存在就创建loginModels.UserToken.objects.update_or_create(user=obj, defaults={'token': token})ret['token'] = tokenexcept Exception as e:ret['code'] = 1002ret['msg'] = '请求异常'return JsonResponse(ret)
- url路径写法```pythonpath('zhylbwg/per/admin/', AuthView.as_view() ), # 生成token
- CBV注意事项
as_view()方法创建类实例
首先 CBV 需要继承自 View 类所以需要使用如下方式进行导包··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()函数可以通过源码进行了解,它的主要作用就是实现请求的分发。
