一:CBV模式&FBV模式
- FBV【Function Base Views】—基于函数的views
CBV【Class Base Views】—基于类的views
1:FBV模式
代码实现方式
from django.shortcuts import render,HttpResponse
import json
from zhylbwg.models import loginModels
from 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'] = 1001
ret['msg'] = '用户名或密码错误'
# 为用户创建token
token = md5.Md5(user)
# 存在就更新,不存在就创建
loginModels.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)
- url路径写法
```python
path('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()函数可以通过源码进行了解,它的主要作用就是实现请求的分发。