文化建设设计网站,梅州网站建,宿迁网站建设要多少钱,网络推广引流路由系统 1.Django1中的路由1.1 普通形式1.2 分组1.2.1 无名分组1.2.2 有名分组 2. Django2版本2.1 传统的路由2.2 正则表达式路由 3. 路由分发3.1 include(一般使用此方式做路由分发)3.2 手动分发 4. name别名及使用name的反向URL生成4.1 一般情况下的别名使用及反向生成4.2 分… 路由系统 1.Django1中的路由1.1 普通形式1.2 分组1.2.1 无名分组1.2.2 有名分组 2. Django2版本2.1 传统的路由2.2 正则表达式路由 3. 路由分发3.1 include(一般使用此方式做路由分发)3.2 手动分发 4. name别名及使用name的反向URL生成4.1 一般情况下的别名使用及反向生成4.2 分组中方向解析URL 5. 名称空间 1.Django1中的路由
1.1 普通形式 在Django1的版本中普通路由url进行匹配其格式如下 urlpatterns [url(regex, view, kwargsNone, nameNone),
] url的regex参数即第一个参数为正则表达式view参数通常为视图函数用来处理业务逻辑kwargs:接收传递给视图函数的参数name为regex参数地址的别名在地址过长时可用别名反向解析 示例
urlpatterns [url(r^admin/, admin.site.urls),url(r^index$,views.index)
] PS:需要注意 正则表达式不需要添加一个前导的反斜杠因为每个URL都有。例如应该是^index而不是 ^/index每个正则表达式前面的’r’ 是可选的但是建议加上如果我们想匹配的路径就只是index/,那么正则表达式应该有开始符与结束符, 如 ^index/$。这样逻辑才算严谨若正则为rindex/在浏览器输入http://127.0.0.1:8001/index/Django会拿着路径部分index/去路由表中自上而下匹配正则表达式一旦匹配成功则立即执行其后的视图函数不会继续往下匹配此处匹配成功的正则表达式是 r^index/$。无论是否书写最后的/都可以匹配成功是因为配置中APPEND_SLASH默认为True且并不会出现在配置文件中若想精确匹配最后的/则应该去settings文件中将APPEND_SLASH设置为False。 1.2 分组 分组实际上可以理解为get请求的第二种方式 get请求的第一种方式 http://127.0.0.1:8000/test/?a1b2get请求的第二种方式 http://127.0.0.1:8000/test/123/11 1.2.1 无名分组
无名分组实际上是re的分组写法即把正则中小括号里的匹配到的内容以位置参数的形式传递给视图函数如下
urls.py文件
from django.contrib import admin
from django.conf.urls import url
from app01 import viewsurlpatterns [# 下述正则表达式会匹配url地址的路径部分为:article/数字/匹配成功的分组部分会以位置参数的形式传给视图函数有几个分组就传几个位置参数url(r^article/(\d)/$,views.article),
]
views.py文件
from django.shortcuts import render
from django.shortcuts import HttpResponse# 需要额外增加一个形参用于接收传递过来的分组数据
def article(request,article_id):return HttpResponse(id为 %s 的文章内容... %article_id)
测试
python manage.py runserver 8001 # 在浏览器输入http://127.0.0.1:8001/article/3/ 会看到: id为 3 的文章内容...1.2.2 有名分组
当我们对分组命名后就会按照keyvalue的关键字参数形式为视图函数传参示例如下 urls.py
from django.contrib import admin
from django.conf.urls import url
from app01 import viewsurlpatterns [url(admin/, admin.site.urls),# 该正则会匹配url地址的路径部分为:article/数字/匹配成功的分组部分会以关键字参数article_id匹配成功的数字的形式传给视图函数有几个有名分组就会传几个关键字参数需要强调一点是视图函数得到的值均为字符串类型url(r^article/(?Particle_id\d)/$,views.article),
]views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse# 需要额外增加一个形参形参名必须为article_id
def article(request,article_id):return HttpResponse(id为 %s 的文章内容... %article_id)测试
python manage.py runserver 8001 # 在浏览器输入http://127.0.0.1:8001/article/3/ 会看到: id为 3 的文章内容...普通分组和命名分组都是为了获取路径中的参数并传递给视图函数区别在于普通分组是以位置参数的形式传递命名分组是以关键字参数的形式传递。但请注意有名分组和无名分组不要同时使用。
2. Django2版本
2.1 传统的路由 在Django2以上的版本中默认的路由通过path精准匹配来识别避免了正则可能出现的一些匹配的问题。 格式如下 urlpatterns [path(admin/, admin.site.urls),path(,views.show_user_info),path(show/, views.show_user_info),path(del/, views.del_user_info),path(update/, views.update_user_info),path(insert/, views.insert_user_info)
]其用法同url并无太大区别path的第一个参数是精确匹配。 2.2 正则表达式路由
burpatterns [re_path(rusers/(?xxid\w-\d)/,views.users),
]Django2版本的re_path的用法同Django1的url完全相同不做过多描述。 3. 路由分发 当功能较多时都写在一个urls文件中显然并不合适可以使用路由分发将功能拆分带不同的app中。 3.1 include(一般使用此方式做路由分发)
include(app命字.url模块名) 模块app命字/url模块名.py 文件件里必须有urlpatterns 列表使用前需要使用 from django.conf.urls import include 导入此函数 示例 djangoproject1/urls.py
from django.urls import path,include
urlpatterns {path(api/, include(apps.api.urls)),path(web/, include(apps.api.urls))
}apps/api/urls.py
from django.urls import path
from apps.api import viewsurlpatterns {# api/auth/path(auth/,views.auth),# api/login/path(login/,views.login)
}path本身支持五种转换器。 str,匹配除了路径分隔符/之外的非空字符串这是默认的形式int,匹配正整数包含0。slug,匹配字母、数字以及横杠、下划线组成的字符串。uuid,匹配格式化的uuid如 075194d3-6885-417e-a8a8-6c931e272f00。path,匹配任何非空字符串包含了路径分隔符/不能用 例如 path(articles/int:year/, views.year_archive), # int:year相当于一个有名分组其中int是django提供的转换器相当于正则表达式专门用于匹配数字类型而year则是我们为有名分组命的名并且int会将匹配成功的结果转换成整型后按照格式year整型值传给函数year_archive但是当本身条件较为复杂时五种转换器可能并不能实现要求。针对这一系列复杂的需要我们可以定义自己的转化器。转化器是一个类或接口它的要求有三点 regex 类属性字符串类型 to_python(self, value) 方法value是由类属性 regex 所匹配到的字符串返回具体的Python变量值以供Django传递到对应的视图函数中。 to_url(self, value) 方法和 to_python 相反value是一个具体的Python变量值返回其字符串通常用于url反向引用。
示例如下
在app01下新建文件path_ converters.py,文件名可以随意命名
class MonthConverter:regex\d{2} # 属性名必须为regexdef to_python(self, value):print(to_python run)return int(value)def to_url(self, value):print(to_url run)return value # 匹配的regex是两个数字返回的结果也必须是两个数字在urls.py中使用register_converter 将其注册到URL配置中
from django.urls import path,register_converter
from app01.path_converts import MonthConverterregister_converter(MonthConverter,mon)from app01 import viewsurlpatterns [path(articles/int:year/mon:month/slug:other/, views.article_detail, nameaaa),]views.py中的视图函数article_detail
from django.shortcuts import render,HttpResponse,reversedef article_detail(request,year,month,other):print(year,type(year))print(month,type(month))print(other,type(other))print(reverse(aaa,args(1988,12,hello))) # 反向解析结果/articles/1988/12/hello/return HttpResponse(xxxx)测试
# 1、在浏览器输入http://127.0.0.1:8000/articles/2009/12/hello/path会成功匹配出参数year2009,month12,otherhello传递给函数article_detail
# 2、在浏览器输入http://127.0.0.1:8000/articles/2009/123/hello/path会匹配失败因为我们自定义的转换器mon只匹配两位数字而对应位置的123超过了2位3.2 手动分发 path(user/, ([path(add/, views.login),path(delete/, views.login), # /user/delete/path(edit/, views.login),path(list/, views.login),], None, None)), 纯粹帮助提取功能的URL防止重复编写。 4. name别名及使用name的反向URL生成
4.1 一般情况下的别名使用及反向生成 别名的使用 from django.urls import path
from app01 import views
urlpatterns [path(login/, views.login, namev1),path(auth/, views.auth, namev2),
]视图函数中反向生成URL from django.urls import reverse
url reverse(v2) # /auth/
url reverse(v1) # /login/HTML模版中反向生成 a href{% url v1 %}添加/a
a href{% url v2 %}添加/a4.2 分组中方向解析URL
无名分组反向解析
url(r^v1/v2/v3/home/(\d)/(\d)/$, views.home, namehome)
# 后端解析
resreverse(home, args(123, 11)) # /v1/v2/v3/home/1
print(res)# 前端解析
a href{% url home 1 123 %}点我看美女/a有名分组反向解析
url(r^v1/v2/v3/home/(?Pyear\d)/(?Pmon\d)/$, views.home, namehome)
# 后端解析
resreverse(home, args(123, 11)) # /v1/v2/v3/home/1
resreverse(home, kwargs{year:123, mon:1}) # /v1/v2/v3/home/1
print(res)# 前端解析
a href{% url home year1 mon123 %}点我看美女/a5. 名称空间
避免name重复可将重名name分别放入不同的namespace
主路由 from django.urls import path, re_path, include# 很多功能很多URL
urlpatterns [path(api/, include(apps.api.urls,namespacex1)),path(web/, include(apps.web.urls,namespacex2)),
]api/urls.pyfrom django.urls import path, re_path
from . import views
# 很多功能很多URL
urlpatterns [path(login/, views.login,namelogin),path(auth/, views.auth, nameauth),
]web/urls.pyfrom django.urls import path, re_path
from . import views
# 很多功能很多URL
urlpatterns [path(home/, views.home,namehome),path(order/, views.order,nameorder),path(auth/, views.order, nameauth),
]反向生成
from django.urls import reverse
url reverse(x1:login) # /api/login/
url reverse(x1:order) # /web/login/url reverse(x1:auth) # /api/login/
url reverse(x2:auth) # /web/login/