目录
一、MVC和MTV
MVC控制器Contorller部分,由Django框架的urlconf来实现
意思就是在Django框架当中,我们可以忽略对Controller的代码书写
MVC: VIEWS负责业务逻辑处理+数据展示
MTV: Views ——业务逻辑处理
Templates—— 数据展示
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')
运行图:
② 分组匹配,动态寻找
# ^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))
运行图如下:
③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))
运行代码图:
④下面这个是常见的动态路由
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))
运行代码图:
二、不适用正则表达式来实现静态和动态路由
一、常用的四种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)
运行结果:
②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))
运行结果展示:
③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))
运行结果展示:
④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)
运行结果展示:
⑥path('articles/<path:wangzhi>',views.article_path)
views视图代码:
def article_path(request,wangzhi):
return HttpResponse('path指定网址%s:'%wangzhi)
运行结果展示:
二、自定义转换器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)
运行界面图: