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

目录

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

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127325714
今日推荐