Django_类视图_MTV模式
Posted 七月的小尾巴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django_类视图_MTV模式相关的知识,希望对你有一定的参考价值。
Django_类视图_MTV模式
两种开发模式
通常我们在程序中,有分为两种开发模式,分别为 前后端不分离的开发模式
和 前后端分离开发模式
。
下面我们分别来了解一下,这两种模式的特性及区别。
-
前后端不分离的开发模式(不推荐)
1)后端如果返回的是一个完整的 html 页面 (页面中邮填充数据) 2)前后端不分离,耦合严重 3)返回的 HTML 页面,实用性、拓展性差 1、只能用于浏览器,其他终端不适配
-
前后端分离
后端返回的是数据(json、xml) 1)这种开发模式为当前主流的开发模式 2)后端只对数据进行处理,只提供数据 3)解耦合 4)前后端同时开发,缩小业务上线周期 5)绝大数的情况下,前端发送 json 格式的参数, 后端同样以 json 格式的数据返回 1、适应性、拓展性非常好 2、适合多终端运行同一套接口(PC/APP/小程序)
MVT 模式 和两种开发模式
什么是 MTV 模式呢?
就是把Web应用分为:模型(Model),模板(Template),视图(View)这三层,这样一来,各组件之间就保持了松耦合关系;M主要是用来负责业务对象和数据库对象,T负责把页面如何展示给用户,V负责业务逻辑,并在适当的时候调用M和T。对于Django来说,还有一个url分发器,它的作用就是将一个个url的页面请求分发给不同的V处理,V再调用相应的M和T。
- M : 全拼为 Model, 与 MVC 的 M功能相同。负责数据库交互,进行数据处理
- V:全拼为 View,与 MVC 中的 C 功能相同,接收请求,进行业务处理,返回响应
- T:全拼为 Template,与 MVC 中的 V功能相同, 负责构造要返回的 html 页面
类视图_HttpResponse_JsonResponse
在了解 类视图之前,我们来回顾一下 视图函数。
def projects(request):
"""
视图函数
:param request:
:return:
"""
print(request)
print(type(request))
# __mro__ 可以查看该对象的继承信息
print(type(request).__mro__)
return HttpResponse("aaaa")
之前的章节中,我们了解了 视图函数,可以看到上方代码中,我们在 view.py中定义了一个非常基础的视图函数。
视图函数的第一个参数是 request
,他是一个HttpRequest
HttpRequest 对象。
HttpRequest 对象包含了请求的所有数据 (请求头、请求体等),视图函数必须要返回一个 HttpResponse
对象或者其子类对象
开发一个简单的 POST 接口
def projects(request):
"""
视图函数
:param request:
:return:
"""
if request.method == "GET":
return HttpResponse("获取项目信息")
elif request.method == "POST":
return HttpResponse("创建项目信息")
elif request.method == "DELETE":
return HttpResponse("删除项目信息")
else:
return HttpResponse("aaaa")
我们可以看到,request
中有一个 method
属性,因此我们可以通过 method
去判断当前接口的请求方式,创建完成之后,我们定义路由。
在 url.py 中的 urlpatterns 中去定义路由
urlpatterns = [
path('projects/', projects),
]
这里我们就完成了一个非常简单的 POST请求的接口。
接口地址:http://127.0.0.1:8000/projects/
我们使用 POSTMAN 来请求一下
get请求可以看到是请求成功的,但是此时如果我们请求 post 的话,会请求失败,原因是因为 django 中除 get请求外,其他类型的请求方式都会有安全认证,因为我们需要在 django的 setting.py
文件中进行配置
# 需要注释掉 'django.middleware.csrf.CsrfViewMiddleware',
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
下面我们来思考一下,前面我们所有的 if else 的判断全部都是在视图函数中完成的,假设我们的业务非常复杂,部分逻辑可能在每个判断中都会有包含,按照目前的设计,代码的耦合性是非常强的,那么我们应该通过什么样的方式,去处理这个问题呢?
下面我们就来了解一下类视图,首先我们需要安装一下 views
pipenv install views
from django.views import View
class ProjectsViews(View):
def get(self, request):
return HttpResponse("获取项目信息")
def post(self, request):
return HttpResponse("创建项目信息")
def put(self, request):
return HttpResponse("更新项目信息")
def delete(self, request):
return HttpResponse("删除项目信息")
我们可以定义一个类视图,将每一个接口的业务进行拆分,我们可以看到不同的请求方式有对应的方式进行对应。如 GET 请求方式,我们对应的是 get函数,并且继承 request 对象。
注意,函数名称我们为固定形式,不能更改,如果你是一个post请求接口,则我们的函数定义必须要为 def post(self, request) :
GET --> get
POST --> post
PUT --> put
DELETE --> delete
PATCH --> patch
并且我们每一个处理请求的方法,必须要得返回 HttpResponse 对象或者 HttpResponse 子类对象。
定义路由视图的路由条目
在 urls.py 中定义路由, 使用 as_view 方法,让类视图和路由映射
# 导入类视图,使用 as_view 方法,让类视图和路由映射
from project.views import ProjectsViews
urlpatterns = [
path('projects/', ProjectsViews.as_view()),
]
上面我们写的接口,所以的数据,都是返回的字符串,如果我们需要返回 json类型的数据,应该怎么做呢?
class ProjectsViews(View):
def get(self, request, pk):
project_data =
"id": 1,
"name": "七月自动化框架",
"tester": "余少琪"
# 方法A,讲数据转换成 str
# json_str = json.dumps(project_data, ensure_ascii=False)
# return HttpResponse(json_str, content_type="application/json", status=201)
# 方式二, 使用 JsonResponse:
return JsonResponse(project_data, json_dumps_params="ensure_ascii": False)
HttpResponse
- 第一个参数为字符串类型(需要返回字符串数据)
- content_type 可以指定响应头中的 content_type 参数
- status 可以指定响应状态码
JsonResponse
- 为 HttpResponse 子类,用于返回 json 数据
- 第一个参数可以直接传字典或者嵌套字典的列表
- 默认添加 content_type=“application/json”
上面我们说了,第一个参数也支持 列表嵌套字典,但是如果我们返回的数据是列表格式的时候,我们需要添加一个参数 safe 设置为False
return JsonResponse(project_data,
json_dumps_params="ensure_ascii": False,
safe=False)
处理不同类型的接口参数
我们上面所学习的内容,支持通过表单传递参数值,或者json串传递参数,但是前端传递参数的类型是多种多样的,比如 url路径参数、或者查询字符串参数等等,那么当我们前端传递这种类型的参数,我们应该如何提取其中的数据呢?
首先,我们需要了解,前端一共有哪些传递参数的方式。
路径参数
通常在url路径中传递的参数,我们称为 路径参数
。如:/project/detail/2530。其中 2530则为路径参数值,通常这类参数都在请求实例方法中,使用关键字参数来接收。
查询字符串参数
查询字符串参数通常以键值对参数拼接在url后方。称为 键值对参数
,如:http://www.xxx.com?key1=value&key2=value2。
查询字符串是有长度限制的,在 django框架中,我们可以使用 request.GET 获取请求参数。
我们使用 postman发送一个请求
debug状态下,我们可以看到 request.GET
返回 QueryDict
, 类似于 python 的 dict 类型。
那么既然类似于python的字典类型,我们可以使用 [‘key1’]、get(‘key’) ,会返回具体的值,如果有多个相同的key,默认获取的是最后一个。
// 方式一: 获取 data的参数值
request.GET['data']
// 方式二:
request.GET.get("data")
如果说,有写特殊情况下,我们有相同的 key,django也提供了对应的方法,我们可以使用 getlist('key1')
, 获取相同 key 多个值,返回 list 类型。
json类型参数
json格式的参数,是我们平时在日常工作中最常见的,json 格式的参数存放在 body中,一般为 字节类型。
可以使用 json.loads(request.body)
来获取数据。
www-form-urlencoded
www-form-urlencoded 一般在前端页面中使用表单录入的参数, request.PSOT 返回 QueryDict ,类似于 pythoh 中的 Dict 类型。
file
文件类型参数,通常传递文本数据,可以使用 request.POST 提取数据。
传递的非文本参数,如文件,可以使用 request.FILE
提取数据。如果传递的是纯粹的文件,可以使用 request.body 获取
请求头参数
// 获取请求头参数的方式一:
request.headers['key'] 或者 .get('key1')
// 方式二:
request.META['HTTP_AUTHORITE']
// 请求头参数可以被转换成 :HTTP_参数名称大写
// 注意:参数名中间不能有 - ,会被自动转化为 _ , 如 user-name --> user_name
总结
本章节主要学习了如果创建类视图,以及MVT 模式 和两种开发模式,内容为个人的学习笔记,仅供参考。
以上是关于Django_类视图_MTV模式的主要内容,如果未能解决你的问题,请参考以下文章
03_Django-GET请求和POST请求-设计模式及模板层
03_Django-GET请求和POST请求-设计模式及模板层
03_Django-GET请求和POST请求-设计模式及模板层
2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC多对多表三种创建方式前后端传输数据编码格式contentTypeajax自定义分页器)