Django后端开发:MVC 和 MTV以及动态路由、静态路由、自定义converters

news/2024/7/5 2:46:43

 

目录

591a1ceab7f546d9b4ca9441e9223af7.png

 

一、MVC和MTV

 二、静态路由和动态路由

        一、通过正则表达式来实现静态和动态路由

        二、不适用正则表达式来实现静态和动态路由

                一、常用的四种url路由

          二、自定义转换器url路由类型


 

 

一、MVC和MTV

157b77f6656645d3bf59a9ba1f90563c.png

 

9dfeb4b2e00d42458837dd2032705b73.png

 MVC控制器Contorller部分,由Django框架的urlconf来实现

意思就是在Django框架当中,我们可以忽略对Controller的代码书写

MVC:         VIEWS负责业务逻辑处理+数据展示

MTV:          Views  ——业务逻辑处理         

                Templates—— 数据展示

181d77b8c43b4fccacd3c003f68435b5.png

Django采用了 MTV 的框架模式,即模型(Model)、模板(Template)和视图(Views),三者之间负责不同的职责。

  • 模型:数据存储层,处理与数据相关的所有事务,例如如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。负责业务对象与数据库的对象(orm)。
  • 模板:表现层,处理与表现相关的决定,例如如何在页面或其他类型的文档中进行显示。
    Django作为Web框架,需要一种很便利的方法动态的生成HTML网页,因此有了模板这个概念。模板包含所需HTML的部分代码以及一些特殊的语法,特殊语法用于描述如何将视图传递的数据动态插入HTML网页中。
    Django可以配置一个或多个模板引擎(甚至是0个,如前后端分离,Django只提供API接口,无需使用模板引擎),模板引擎有Django模板语言(DTL)和Jinja2。Django模板语言是Django内置的功能之一,Jinja2是当前Python流行的模板语言。
  • 视图:业务逻辑层,存取模型及调取恰当模板的相关逻辑,模型与模板的桥梁。主要负责处理用户请求和生成相应的相应内容,然后在页面或其他类型文档中显示。也可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和业务上的逻辑。我们习惯使用视图函数处理HTTP请求,记载视图里定义def函数,这种方式成为FBV(Function Base Views)。

 

 二、静态路由和动态路由

        一、通过正则表达式来实现静态和动态路由

Django 的路由本质上是通过正则表达式来对用户请求的Url 进行匹配

#  代表必须寻找以$字符是指以2003结尾
    #  ^articles/2003/$ 前面再加个^代表必须以articles开头2003结尾
    #前面加的r ————代表原始字符串匹配
    re_path(r'^articles/2003/$',views.atricle_2003), #静态语句
    #分组匹配,动态寻找
    # ^articles代表必须以articles开头,()代表动态匹配规则要以年份year结尾,{4}代表0-9中任意四位都可以满足
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.atricle_archive),
    #取消   ?P<year> 相当于取消键值对前面固定死的键值
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.atricle_archive2),
    #\w :代表任意的大小写字母,并且包含任意的数字 \w-:前面的同时再加上一个双横线  +代表一个或者多个
    #下面这个是常见的动态路由
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$',views.atricle_archive3),
    #\d表示数字,+代表一个或者多个   \d+代表一个或者多个数字
    re_path(r'^articles/(?P<arg1>[0-9]{4})/(?P<arg2>\d+)/(?P<slug>[\w-]+)/$', views.atricle_archive4)

       ①代表必须寻找以$字符是指以2003结尾
      ^articles/2003/$ 前面再加个^代表必须以articles开头2003结尾
    #前面加的r ————代表原始字符串匹配
    re_path(r'^articles/2003/$',views.atricle_2003), #静态语句

views界面代码:

def atricle_2003(request):

    return HttpResponse('article 2003')

运行图:

        e748cfd2bf7b47b495b129ea19aba274.png 

          ② 分组匹配,动态寻找
    # ^articles代表必须以articles开头,()代表动态匹配规则要以年份year结尾,{4}代表0-9中任意四位都可以满足
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.atricle_archive)

views界面代码:

def atricle_archive(request,year,month):
    return HttpResponse('article 动态 %s-%s'% (year,month))

 运行图如下:

6b16274b6c4249a3bd181f573c2df348.png

         ③re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.atricle_archive2),
    \w :代表任意的大小写字母,并且包含任意的数字 \w-:前面的同时再加上一个双横线  +代表一个或者多个

views界面代码:

def atricle_archive2(request,arg1,arg2):
    return HttpResponse('article 动态 %s----%s'% (arg1,arg2))

运行代码图:

        30954672aab24e56814cc11703482584.png 

 ④下面这个是常见的动态路由
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$',views.atricle_archive3),
    #\d表示数字,+代表一个或者多个   \d+代表一个或者多个数字
    re_path(r'^articles/(?P<arg1>[0-9]{4})/(?P<arg2>\d+)/(?P<slug>[\w-]+)/$', views.atricle_archive4)

views界面代码:

def atricle_archive3(request,year,month,slug):
    return HttpResponse('article year month slug 动态 %s %s %s' %(year,month,slug))
def atricle_archive4(requst,arg1,arg2,slug):
    return HttpResponse('acticles %s %s %s'%(arg1,arg2,slug))

运行代码图:

        dc4c59e2eafb44229162250fb119f8ce.png 

 

        二、不适用正则表达式来实现静态和动态路由

                一、常用的四种url路由

 Django 2.0 推荐了新用法path

path('article_2009',views.article_2009),
    path('articles/<int:year>/',views.article_year),
    path('articles/<int:year>/<int:month>/',views.article_year_month),
    path('articles/<int:year>/<int:month>/<slug:slug>',views.article_year_month_slug),
    #str 匹配不为空的字符串,除了‘/’
    path('articles/<str:name>/',views.article_name),
    #uuid 唯一编码
    path('articles/<uuid:uuid>/',views.article_uuid),
    #path 可以匹配任何非空字符串,并且包含 ‘/’
    path('articles/<path:wangzhi>',views.article_path),
    # converters 自定义路由url
    path('articles/<YYY:year>',views.converters)

①path('articles/<int:year>/',views.article_year)

views视图代码:

def article_year(request,year):
    return HttpResponse('Hello,今年是%s年'%year)

运行结果:

c307c20d0d374c5487a327fc5a88502d.png

②path('articles/<int:year>/<int:month>/',views.article_year_month)

views视图代码:

def article_year_month(request,year,month):
    return HttpResponse('Helo,今年是%s年,%s月'%(year,month))

运行结果展示:765ea23444f842f6984cbc89dc5cbab5.png

 

③path('articles/<int:year>/<int:month>/<slug:slug>',views.article_year_month_slug)

views视图代码:

def article_year_month_slug(request,year,month,slug):       #slug可以代表任意的大小写字母和数字
    return HttpResponse('Helo,今年是%s年,%s月任意的大小写字母和数字slug为:%s'%(year,month,slug))

运行结果展示:5cd2711e79114d1589ab37454600fec5.png

 

④path('articles/<str:name>/',views.article_name)

views视图代码:

def article_name(request,name):
    return HttpResponse('文章的名字为:%s'%name)

运行结果展示:

⑤ path('articles/<uuid:uuid>/',views.article_uuid)

views视图代码:

def article_uuid(request,uuid):
    return HttpResponse('特殊编码%s:'%uuid)

运行结果展示:9449a70d8e3a46058bb81e69b92e6ad3.png

 

⑥path('articles/<path:wangzhi>',views.article_path)

views视图代码:

def article_path(request,wangzhi):
    return HttpResponse('path指定网址%s:'%wangzhi)

运行结果展示:   1185fe6128124a4da6ee32668fa978dc.png

 

          二、自定义转换器url路由类型

urls界面代码:

from django.urls import path,re_path,register_converter
from . import converters
def converters(request,year):
    return HttpResponse('converters自定义年份YYY为:%s'%year)

converters.py界面代码:

class YearConvert:
    regex=r'[0,9]{4}'

    def to_python(self,value):
        return int(value)
    def to_url(self,value):
        return "%04d"

views界面代码:

def converters(request,year):
    return HttpResponse('converters自定义年份YYY为:%s'%year)

运行界面图:

8c5e676fa9d4438ea5c286e17c1eecfc.png

 

 


http://lihuaxi.xjx100.cn/news/91362.html

相关文章

2022 需求工程复习真题【太原理工大学】

哈喽大家好&#xff0c;本篇是我整理出来的一些需求工程历年选择、填空真题&#xff0c;主要是针对期末考试用的&#xff0c;其余模块持续更新中&#xff0c;仅供参考&#xff01;>_< 目录 一、选择题 二、填空题 一、选择题 1.项目的前景和范围文档、用户需求文档都被…

Python 爬虫详解

一、爬虫概述 1、爬虫简介 要对数据进行处理和分析&#xff0c;首先就要拥有数据。在当今这个互联网时代&#xff0c;大量信息以网页作为载体&#xff0c;网页也就成了一个很重要的数据来源。但是&#xff0c;网页的数量非常之多&#xff0c;如果以人工的方式从网页上采集数据…

【SSM入门(二)】:setter依赖注入【超简单】

目录 &#x1f31e;测试结果 &#x1f31e;实现步骤 &#xff08;1&#xff09;建立空项目 ​编辑 &#xff08;2&#xff09;建立一个模块&#xff1a;maven项目 &#xff08;3&#xff09; 建立数据层dao和业务层service的接口和实现类文件 &#xff08;4&#xff09;UserDao…

WEB在线客服系统(websocket+Golang)

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 WEB在线客服系统&#xff0c;项目使用golang开发的&#xff0c;手机和电脑上都是可以自适应的。可以展示在网页页面右下角&#xff0c;只需要一段js代码&#xff0c;就可以实现功能。缩小后以悬浮的形式保留。 …

jQuery中的ajax

jquery中ajax XMLHttpRequest用法复杂&#xff0c;所以jquery对他进行封装&#xff0c;极大地降低了ajax的使用难度jquery对ajax发起请求三种方法 (1) $.get() 获取数据 (2) $.post() 提交数据 (3) $.ajax() 获取和提交数据 $.get() 语法&#xff1a; $.get(url,[data],[cal…

matlab画图(一、柱状图)

&#x1f40b; 前言&#xff1a;柱状图利用柱子的高度&#xff0c;反映数据的差异。肉眼对高度差异很敏感&#xff0c;辨识效果非常好。柱状图的局限在于只适用中小规模的数据集。 &#x1f42c; 目录: 一、数据获取二、简单柱状图三、分组柱状图四、堆叠柱状图 一、数据获取…

Android 内存溢出、垃圾回收、四种引用

内存溢出 内存溢出&#xff08;OutofMemory&#xff09;&#xff1a;系统会给每个APP分配内存也就是HeapSize值。当APP占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存时就会抛出的OutOfMemory异常。 内存泄漏&#xff08;MemoryLeak&#xff09;&#xff1a;当…

Windows环境下使用ssh服务器;MobaXterm1修改提交文件

创建文件夹:mkdir mkdir xxx 创建文件夹xxx mkdir a1 a2 a3 批量创建文件夹 a1、文件夹 a2、文件夹 a3 mkdir -p b1/b2/b3 连续创建文件夹 b1、文件夹 b2、文件夹 b3 前提条件 &#xff1a; Windows系统上挂载ssh服务器 通过:MobaXterm1 和其他内置支持Linux命令 我的提交 工具…