温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Django的路由系统的分类和URLconf的配置

发布时间:2021-09-10 11:12:14 来源:亿速云 阅读:207 作者:chen 栏目:大数据

这篇文章主要讲解了“Django的路由系统的分类和URLconf的配置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Django的路由系统的分类和URLconf的配置”吧!

静态路由和动态路由

静态路由:已经明确定义好的一条路由,比如下例,用户只能在浏览器上输入/articles/2003/ 才能匹配到这条路由,输入任何其它的都匹配不上本条。

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
]

动态路由:定义的只是路由规则,比如只能输入数字、或特定排列、长度的字符等,你不知道用户会具体输入什么,只要符合你的规则即可。

URLconf配置

Django2.0 基本格式

from django.urls import path
from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

以下路由对应的views.py视图如下:

def special_case_2003(request):
    return HttpResponse("dddd")

def year_archive(request,year):
    return HttpResponse("year_archive" + str(year))

def month_archive(request,year,month):
    return HttpResponse("month_archive %s-%s" %(year,month))

def article_detail(request,year,month,slug):
    return HttpResponse("article_detail %s-%s %s" %(year,month,slug))

说明:

  • 要从URL捕获一个变量,需要使用尖括号(<>)

  • 需要捕获的变量能够可选择地包含一个转换类型。例如:使用<int:name>捕获一个整数参数。如果没有转换器,则匹配任何不包含(/)的字符

  • 没有必须在URL前面加斜线/。例如:articles而非/articles

请求示例:

  • /articles/2005/03/请求会匹配第三条规则

  • /articles/2003/请求会匹配第一条规则而不是第二条

  • /articles/2003请求不会匹配任何规则,因为这个URL没有以斜线/结尾

  • /articles/2003/03/building-a-django-site/会匹配最后一条规则

默认的Path converters:

  • str:匹配任何非空字符串,不包含路径分隔符/

  • int:匹配任何整数

  • slug:匹配任何字母、数字、下划线(_)和连接线(-)。例如:building-your-1st-django-site

  • uuid:匹配UUID字符串。例如:075194d3-6885-417e-a8a8-6c931e272f00

  • path:匹配任何非空字符串,包含路径分隔符/

自定义Path Converter

自定义Path Converter必须包含以下要素:

- 一个名为`regex`的类属性
- 一个 `to_python(self, value)`方法。该方法表示将匹配的字符串转换为应该传递给视图函数的类型
- 一个`to_url(self, value)`方法。该方法处理将Python类型转换为要在URL中使用的字符串
class FourDigitYearConverter:
    regex = '[0-9]{4}'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return '%04d' % value

使用时需使用register_converter()将自定义Converter注册进Django中:

from django.urls import register_converter, path
 
from . import converters, views
 
register_converter(converters.FourDigitYearConverter, 'yyyy')
 
urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<yyyy:year>/', views.year_archive),
    ...
]

include 子url

当有多个app时,每个app可以有自己的urls.py, 只需在顶级urls.py中include一下就可以

from django.urls import include, path

urlpatterns = [
    # ... snip ...
    path('community/', include('aggregator.urls')),
    path('contact/', include('contact.urls')),
    # ... snip ...
]

django 在匹配url时,只要遇到include()语法, 就会把url分成2部分,比如上面代码里的url, 只要匹配上community/,就会把整条url丢给include('aggregator.urls')子urls.py。 子urls.py负责匹配后面的部分。

减少重复的url

如果url 中出向很多重复的部分,可以按下面的方法聚合

from django.urls import include, path

from apps.main import views as main_views
from credit import views as credit_views

extra_patterns = [
    path('reports/', credit_views.report),
    path('reports/<int:id>/', credit_views.report),
    path('charge/', credit_views.charge),
]

urlpatterns = [
    path('', main_views.homepage),
    path('help/', include('apps.help.urls')),
    path('credit/', include(extra_patterns)),
]

在此例子中,/credit/reports/请求将会被credit_views.report()方法处理

传递额外参数给views

from django.urls import path
from . import views
 
urlpatterns = [
    path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')

感谢各位的阅读,以上就是“Django的路由系统的分类和URLconf的配置”的内容了,经过本文的学习后,相信大家对Django的路由系统的分类和URLconf的配置这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI