博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django2.x path使用方法
阅读量:2346 次
发布时间:2019-05-10

本文共 3423 字,大约阅读时间需要 11 分钟。

新项目,新技术,关于django2.x path路由用法总结。

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

path与url的区别

在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:

原来的url:

url(r'^articles/(?P
[0-9]{4})/$', views.year_archive),

Django2.0新语法:

path('articles/
/', views.year_archive),

新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。

在Django1.x里,我们需要对year做类型转换:

def year_archive(request, year):    year = int(year)

URL参数捕获语法

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

  1. 在url里使用尖括号“<>”来捕获值
  2. 尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
  3. url不需要以斜杠开头。

代码示例:

from django.urls import pathfrom . import viewsurlpatterns = [    path('articles/2003/', views.special_case_2003),    path('articles/
/', views.year_archive),    path('articles/
/
/', views.month_archive),    path('articles/
/
/
/', views.article_detail),]

匹配示例

  • /articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
  • /articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
  • /articles/2003:没有匹配到规则,原因是所有的规则都是以斜杠结尾
  • /articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)

Path Converter

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

Django2.0自带的PathConveter包括:

  • str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
  • int:匹配0及正整数。
  • slug:匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
  • path:匹配任何非空字符串,包含了路径分隔符(/)

例子: path('image_codes/<uuid>', views.xxxx)  image_codes是前缀,<uuid>是django自带的配合器写法,得到的是一个UUID对象, 在视图方法中通过参数来接受这个 uuid    例如: def get(self,request,uuid) 可以打印这个UUID 得到是一个前端传过来的uuid.

自定义Path Converter

定义Converter类需要包含下面的属性或方法:

  • regex属性,字符串类型
  • to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。
  • to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。

定义Path Converter

class FourDigitYearConverter:    regex = '[0-9]{4}'    def to_python(self, value):        return int(value)    def to_url(self, value):        return '%04d' % value

使用注册Converter到url配置里:

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

re_path正则表达式匹配

Django2.0也支持我们使用正则表达式来捕获值。注意,用正则表达式捕获值,需要使用,而不是前面介绍的path()。

正则表达式建议使用命名正则表达式组,语法如下:

(?P
pattern)

其中,尖括号里的name为分组名,pattern为正则表达式。

前面的示例可以使用正则表达式修改为:

from django.urls import path, re_pathfrom . import viewsurlpatterns = [    path('articles/2003/', views.special_case_2003),    re_path('articles/(?P
[0-9]{4})/', views.year_archive),    re_path('articles/(?P
[0-9]{4})/(?P
[0-9]{2})/', views.month_archive),    re_path('articles/(?P
[0-9]{4})/(?P
[0-9]{2})/(?P
[\w-_]+)/', views.article_detail),]

与前面的示例不同点:

  • 这里的代码匹配更加严格,比如year为10000就无法匹配,因为它超出了正则规定的4位数
  • 传给view函数的参数为字符串类型,这点和 Django使用url 是一样的。

设置默认值

在path里支持对view设置默认值。

from django.urls import pathfrom . import viewsurlpatterns = [    path('blog/', views.page),    path('blog/page
/', views.page),]# View (in blog/views.py)def page(request, num=1):    # Output the appropriate page of blog entries, according to num.    ...

page函数num的默认值设置为1.

转载地址:http://dvivb.baihongyu.com/

你可能感兴趣的文章
Hibernate自动生成实体类
查看>>
Java Memcached
查看>>
JAVA WebSpider
查看>>
XML自动建表/存库
查看>>
Java实现Web服务器
查看>>
C# readonly与const的区别
查看>>
MFC 自定义消息的一般过程
查看>>
剖析Windows消息处理机制
查看>>
多线程入门教程(二)基本概念
查看>>
多线程入门教程(三)线程控制
查看>>
多线程入门教程(四)线程间通信
查看>>
多线程入门教程(五)MFC的多线程
查看>>
多线程入门教程(六)综合实例
查看>>
C/C++ 多线程学习心得
查看>>
C/C++四种退出线程的方法
查看>>
多线程编程要点
查看>>
c++CreateEvent函数在多线程中使用及实例
查看>>
c++多线程同步(1)
查看>>
Windows 下 C/C++ 多线程编程入门参考范例
查看>>
浅析stack around the variable was corrupted
查看>>