轻轻松松学Django(二):路由层(django.urls URLconfs)
1.path(route,view,name,kwargs)详解
1.1 四个参数详解
route是包含URL模式的字符串。在处理请求时,Django从第一个模式开始,urlpatterns然后沿列表向下移动,将请求的URL与每个模式进行比较,直到找到匹配的URL。
view当Django找到匹配的模式时,它将使用HttpRequest对象作为第一个参数,并将路线中所有“捕获”的值作为关键字参数来调用指定的view函数。
name命名URL可以使您在Django中的其他地方(尤其是在html中a标签或者action响应url时)明确地引用它。这项强大的功能可让您修改单个文件即可对项目的URL模式进行全局更改。
kwargs可以在字典中将任意关键字参数传递给目标视图。这里不说具体用法
1.2 参数route匹配规则
from django.urls import include, path
urlpatterns = [
path('index/', views.index, name='main-view'),
path('bio/<username>/', views.bio, name='bio'),
path('articles/<slug:title>/', views.article, name='article-detail'),
path('articles/<slug:title>/<int:section>/', views.section, name='article-section'),
path('weblog/', include('blog.urls')),
...
]
该route参数应该是一个字符串或 gettext_lazy(),其中包含一个URL模式。该字符串可能包含尖括号(如上),以捕获URL的一部分并将其作为关键字参数发送到视图。尖括号可包含转换器规范(如的int部分int:section),该规范限制了匹配的字符,还可能更改传递给视图的变量的类型。例如,int:section匹配一串十进制数字并将该值转换为int。
Django默认支持以下5个转化器:
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符
2. re_path(route, view, name,kwargs)详解
使用re_path需要先导入模块 :from django.urls import path,re_path
route,view,name,kwargs三者功能上面已经介绍,不过re_path中的route可以写入正则表达式,如图
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
3.include()函数详解
3.1 include(module,namespace = none)详解
其中module是分发的应用的路由路径,namespace = none,指的是不使用名称空间
在app01/views.py下定义函数:
from django.shortcuts import render, HttpResponse
def app01_index(request):
return HttpResponse('include()路由分发功能展示')
这是Django中最简单的视图。要调用该视图,我们需要将其映射到此,我们需要一个URLconf。要在民意调查目录中创建URLconf,请创建一个名为的文件urls.py。您的应用目录现在应如下所示:
然后在app01/urls.py文件中包括以下代码:
from django.urls import path
from . import views
urlpatterns = [
path('', views.app01_index, name='index'),
]
下一步是将根URLconf指向orm2.urls模块。在中 orm2/urls.py,添加的导入django.urls.include并将插入 include()到urlpatterns列表中,因此您具有:
from django.urls import include, path
urlpatterns = [
path('index/', include('app01.urls')),
path('admin/', admin.site.urls),
]
浏览器输入http://127.0.0.1:8000/index/
首先orm2下的urls检测到“index/”,遇到includ,路由会继续去app01.urls 寻找触发的函数,在app01.urls中urlpatterns匹配到’ ’ 就会触发app01.views中的定义的app_01函数,并在浏览器中渲染,从而展示文字‘include()路由分发功能展示’
3.2 include(module,namespace)详解
命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。 由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回 我们**在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。**名称空间不同,即使路由的name相同,申明不同的名称空间,依然能反向解析出正确的路由路径
在orm2项目下的urls.py:
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^app01/', include("app01.urls",namespace="app01")),
re_path(r'^app02/', include("app02.urls",namespace="app02")),
]
app01.urls:
urlpatterns = [
path('index/',views.index,name="index"),
]
app02.urls:
urlpatterns = [
path('index/',views.index,name="index"),
]
app01.views
from django.core.urlresolvers import reverse
def index(request):
return HttpResponse(reverse("app01:index"))
app02.views
from django.core.urlresolvers import reverse
def index(request):
return HttpResponse(reverse("app02:index"))
转载:https://blog.csdn.net/WSRY_GJP/article/details/105521481