django URL (路由系统)

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

语法:

urlpatterns = [
    path(正则表达式, views视图函数,参数,别名),
]

参数说明:

一个正则表达式字符串

一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

可选的要传递给视图函数的默认参数(字典形式)

一个可选的name参数

无命令分组

举例:

修改mysite目录下的urls.py,最后一行添加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('userInfo/', views.userInfo),
    #完全匹配,必须是articles/2003/,后面加其他的,也会报404
    path('articles/2003/', views.special_case_2003),
]

修改blog目录下的views.py,添加函数special_case_2003

def year_archive(req,year):
    #在Django1.x里,我们需要对year做类型转换:
    #year = int(year)
    #在2.0里面,不需要转换year
    return HttpResponse(year)

访问url

http://127.0.0.1:8000/articles/2003/

页面输出:2003

如果访问以下链接

http://127.0.0.1:8000/articles/2003/01

页面提示404,因为它是完全匹配

Page not found (404)

有命令分组(推荐)

上面匹配年份的,可以改写成这样:

如果需要匹配年份,年份是4位数据,需要使用正则匹配,那么需要导入re_path模块,代码如下:

from django.contrib import admin
from django.urls import path,re_path
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('userInfo/', views.userInfo),
    #正则匹配4位整数
    re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),

访问url

http://127.0.0.1:8000/articles/2004/

页面输出:2004

访问2008,同样也可以输出2008

在Django2.0其中一个新特性为:简化Url路由的语法

上面的url,可以使用Django2.0新语法

path('articles/<int:year>/', views.year_archive),

它支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数

并且会自动转换year为整型而不是字符串。

URL参数捕获

在新的语法里,url字符串有以下规则:

    1.在url里使用尖括号“<>”来捕获值

    2.尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。

    3.url不需要以斜杠开头。

代码示例:

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('2003')

def year_archive(request,year):
    return HttpResponse(year)

def month_archive(request,year,month):
    return HttpResponse('{}/{}'.format(year,month))

def article_detail(request,year,month,slug):
    return HttpResponse('{}/{}/{}'.format(year,month,slug))

匹配示例:

/articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)

/articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)

/articles/2003/as:没有匹配到规则,原因是所有的规则都是以斜杠结尾

/articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)

分别访问页面:

http://127.0.0.1:8000/articles/2005/03/

页面输出:2005/3

http://127.0.0.1:8000/articles/2003/

页面输出:2003

http://127.0.0.1:8000/articles/2003/as

页面输出:Page not found (404)

http://127.0.0.1:8000/articles/2003/03/building-a-django-site/

页面输出:2003/3/building-a-django-site

Path Converter

url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。

默认Path converter

Django2.0自带的PathConveter包括:

    str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。

    int:匹配0及正整数。

    slug:匹配字母、数字以及横杠、下划线组成的字符串。

    uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

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

注册自定义Path Converter

当默认的Path Converter不能满足需求时,Django2.0支持用户注册自定义的Path Converter。

Path Converter是一个类,定义Converter类需要包含下面的属性或方法:

    regex属性,字符串类型

    to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。

    to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。

示例:

定义Path Converter

新建一个converters.py文件,与urls.py在同一目录下,写一个类,内容如下:

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到url配置里,并使用它。如下所示,注册了一个yyyy:

修改urls.py,内容如下:

from django.contrib import admin
#增加register_converter方法
from django.urls import path,re_path,register_converter
from blog import views
#导入converters模块
from . import converters
#使用register_converter()注册Converter到url配置里,并使用它,注册了一个yyyy
register_converter(converters.FourDigitYearConverter, 'yyyy')

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<yyyy:year>/', views.year_archive),
]

访问链接

http://127.0.0.1:8000/articles/2003/

匹配第一条规则,页面输出2003

http://127.0.0.1:8000/articles/2018/

匹配第二条规则,页面输出2018

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏漫漫全栈路

ASP.NET MVC 行为详解

前面分别介绍了MVC中的三个重要部分,而行为,则是其中C-Controller中的重要内容,下面详解一二。 一般继承自Controller类,类Controll...

2804
来自专栏python爬虫日记

转载、Python的编码处理(二)

然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码

902
来自专栏爱撒谎的男孩

Struts2之获取请求参数

3466
来自专栏积累沉淀

Linux之grep和egrep命令总结

grep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 -i :忽略大小写 ...

18810
来自专栏Java成神之路

Spring_总结_03_装配Bean(三)之XML配置

用来装配bean的最基本的XML元素包含在spring-beans模式中,在上面这个XML文件中,它被定义为根命名空间。

603
来自专栏北京马哥教育

搞定Linux Shell文本处理工具,看完这篇集锦就够了

Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell脚本的过程中,还...

2792
来自专栏数值分析与有限元编程

Fortran知识 | 代码错误(无法解析的外部符号)

如图所示,提示为:无法解析的外部符号。 ? 找不到某些函数或子程序。如果这些函数或子程序在函数库中,没有正确被使用;如果被提示的函数应该是数组,可能没有定义为数...

3749
来自专栏学习有记

XML进阶:Level 1 - XML简介

1283
来自专栏雪地二货笔记库

如何在JSP中格式化时间

在将后台数据传回前台的时候直接传输date属性的变量不进行格式化就会产生这种情况。 若是使用的是jsp则可以使用专门进行格式化的JSTL标签。 <%@ tag...

2932
来自专栏java初学

spring框架(1)— 依赖注入

46212

扫码关注云+社区

领取腾讯云代金券