目录
一、MVC和MTV
二、静态路由和动态路由
一、通过正则表达式来实现静态和动态路由
二、不适用正则表达式来实现静态和动态路由
一、常用的四种url路由
二、自定义转换器url路由类型
MVC控制器Contorller部分,由Django框架的urlconf来实现
意思就是在Django框架当中,我们可以忽略对Controller的代码书写
MVC: VIEWS负责业务逻辑处理+数据展示
MTV: Views ——业务逻辑处理
Templates—— 数据展示
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[0-9]{4})/(?P[0-9]{2})/$',views.atricle_archive),
#取消 ?P 相当于取消键值对前面固定死的键值
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.atricle_archive2),
#\w :代表任意的大小写字母,并且包含任意的数字 \w-:前面的同时再加上一个双横线 +代表一个或者多个
#下面这个是常见的动态路由
re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-]+)/$',views.atricle_archive3),
#\d表示数字,+代表一个或者多个 \d+代表一个或者多个数字
re_path(r'^articles/(?P[0-9]{4})/(?P\d+)/(?P[\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
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
#\d表示数字,+代表一个或者多个 \d+代表一个或者多个数字
re_path(r'^articles/(?P
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))
运行代码图:
Django 2.0 推荐了新用法path
path('article_2009',views.article_2009),
path('articles//',views.article_year),
path('articles///',views.article_year_month),
path('articles///',views.article_year_month_slug),
#str 匹配不为空的字符串,除了‘/’
path('articles//',views.article_name),
#uuid 唯一编码
path('articles//',views.article_uuid),
#path 可以匹配任何非空字符串,并且包含 ‘/’
path('articles/',views.article_path),
# converters 自定义路由url
path('articles/',views.converters)
①path('articles/
views视图代码:
def article_year(request,year):
return HttpResponse('Hello,今年是%s年'%year)
运行结果:
②path('articles/
views视图代码:
def article_year_month(request,year,month):
return HttpResponse('Helo,今年是%s年,%s月'%(year,month))
③path('articles/
views视图代码:
def article_year_month_slug(request,year,month,slug): #slug可以代表任意的大小写字母和数字
return HttpResponse('Helo,今年是%s年,%s月任意的大小写字母和数字slug为:%s'%(year,month,slug))
④path('articles/
views视图代码:
def article_name(request,name):
return HttpResponse('文章的名字为:%s'%name)
运行结果展示:
⑤ path('articles/
views视图代码:
def article_uuid(request,uuid):
return HttpResponse('特殊编码%s:'%uuid)
⑥path('articles/
views视图代码:
def article_path(request,wangzhi):
return HttpResponse('path指定网址%s:'%wangzhi)
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)
运行界面图: