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自定义分页器)

如何django快速开发自适应管理系统53

Django-mtv开发模式