django的路由层
1 路由配置
① project的urls.py的操作
from app01 import views urlpatterns = [ path('admin/', admin.site.urls), # # 1路由配置: 路径-----> 视图函数 re_path(r'^articles/2003/$',views.special_case_2003), # special_case_2003(request) re_path(r'^articles/([0-9]{4})/$', views.year_archive), # year_archive(reauest,1999) re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # year_archive(reauest,1999,11) ]
② app01 views.py 操作
from django.shortcuts import render,HttpResponse # HttpResponse 响应对象 def special_case_2003(request): return HttpResponse("special_case_2003") def year_archive(request,year): return HttpResponse(year) def month_archive(request,year,month): return HttpResponse(year+"-"+month)
2 有名分组
正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
① project的urls.py的操作
urlpatterns = [ # 有名分组 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # year_archive(reauest,year=2000,month=11) ]
② app01 views.py 操作
from django.shortcuts import render,HttpResponse # 有名分组 def month_archive(request,month,year): return HttpResponse(year+"-"+month)
3 路由分发
from django.urls import path,re_path,include from app01 import views urlpatterns = [ path('admin/', admin.site.urls), # 路由分发 re_path(r"app01/",include("app01.urls")), ]
4 名称空间
名称空间
命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
我们在开发项目时,会经常使用name属性反解出URL,当在不同的app的urls中定义相同的name时 需要用到 名称空间。
① project的urls.py的操作
urlpatterns = [ re_path(r'^admin/', admin.site.urls), # 名称空间 re_path(r"^app01/",include(("app01.urls","app01"))), re_path(r"^app02/",include(("app02.urls","app02"))), ]
② 不同的app urls操作
app01.urls urlpatterns = [ re_path(r'^index/', views.index,name="index"), ] ---------------------------------------------------------------------- app02.urls urlpatterns = [ re_path(r'^index/', views.index,name="index"), ]
③ 不同的app views操作
app01.views from django.shortcuts import render,HttpResponse from django.urls import reverse def index(reqeust): return HttpResponse(reverse("app01:index")) ---------------------------------------------------------------------- app02.views from django.shortcuts import render,HttpResponse from django.urls import reverse def index(reqeust): return HttpResponse(reverse("app02:index"))
5 反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。
人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
①方式1
在模版中
app01 views.py 操作
from django.urls import path,re_path,include from app01 import views urlpatterns = [ # 反向解析 # name= 这是别名 反向解析 path('login.html/', views.login,name="auth"), ]
HTML中的操作
<form class="form-horizontal" method="post" action="{% url 'auth' %}">
②方式2
在Python中
app01 urls.py 操作
from django.urls import path,re_path from app01 import views urlpatterns = [ path('timer/', views.timer), re_path("yang/",views.yang,name="y"), re_path(r'^articles/([0-9]{4})/$', views.year_archive,name="yyyy"), # year_archive(reauest,1999) ]
app01 views.py操作
# timer def timer(request): import datetime now = datetime.datetime.now().strftime("%y-%m-%d %X") url = reverse("y") url = reverse("yyyy", args=(1234,)) print("url", url) return render(request,"timer.html",{"now":now}) def year_archive(request,year): url = reverse("yyyy") return HttpResponse(year) def yang(request): url = reverse("y") return HttpResponse("yang")
6 url控制器的path方法
Django 默认支持的5种转化器
str 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int 匹配正整数,包含0。
slug 匹配字母、数字以及横杠、下划线组成的字符串。
uuid 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path 匹配任何非空字符串,包含了路径分隔符
对于复杂或者复用的需求,就需要定义自己的转化器。
regex 类属性,字符串类型
to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
①用自带的转化器
app01 urls.py 操作
from django.urls import path,re_path from app01 import views urlpatterns = [ # url控制器之path方法 path("articles/<int:year>",views.path_year), #parth(reauest,1234) ]
app01 views.py 操作
def path_year(request,year): print(year) print(type(year)) return HttpResponse("path year")
②自定义转化器
新建一个py文件 app01 urlconvert.py
class MonConvert: regex = "[0-9]{2}" def to_python(self, value): return int(value) def to_url(self, value): return '%04d' % value
app01 urls.py 操作
from app01.urlconvert import MonConvert # 注册自定义转换器 register_converter(MonConvert,"mm") urlpatterns = [ path("articles/<mm:month>",views.path_month) ]
app01 views.py 操作
def path_month(request,month): print(month) print(type(month)) return HttpResponse("path month")