django namespace_轻轻松松学Django(二):路由层(django.urls URLconfs)

本文详细介绍了Django中的路由配置,包括path()函数的route、view、name和kwargs参数,以及route的匹配规则和内置转换器。同时,解释了re_path()如何使用正则表达式进行更灵活的URL匹配。此外,还阐述了include()函数的作用,用于分发应用的路由,并讨论了命名空间在解决URL冲突中的重要性。
摘要由CSDN通过智能技术生成

eea14bdfd58085175ba09a6353c3b433.png

轻轻松松学Django(二):路由层(django.urls URLconfs)

转载请申明来源,本人原创

1.path(route,view,name,kwargs)详解

1.1 .path(route,view,name,kwargs) 四个参数详解

**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模式。该字符串可能包含尖括号(<username>如上),以捕获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。您的应用目录现在应如下所示:

101aa5fdbf7989dc12484dbad8de7be5.png

然后在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"))]

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"))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值