前置

在app_01——>view.py写下如下的的代码。

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3. def index(request, year=2020):
  4. str1 = 'hello, world, ' + str(year)
  5. if year == 2020:
  6. return HttpResponse('hello,world, 2020.02')
  7. else:
  8. return HttpResponse(str1)
  9. def un_index(request):
  10. return HttpResponse('你好')

这个用于路由匹配后,返回的简易视图函数。

路由匹配简述

django3.0支持两种路由匹配,一种:path匹配,一种:re_path匹配。

path匹配

基本格式:

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. path('index/', views.index),
  5. # path(url , 视图函数, 参数, 别名)
  6. ]

path函数用于精准匹配,只有字符完全一致才会触发函数。

获取url中的有用信息

基本规则:

  • 使用尖括号(<>)从url中捕获值。
  • 捕获值中可以包含一个转化器类型(converter type),比如使用 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
  • 无需添加前导斜杠。

实例:在Hello——>urls.py中添加如下代码。

  1. from django.urls import path, re_path
  2. from django.conf.urls import url
  3. from . import views
  4. urlpatterns = [
  5. path('index/', views.index),
  6. path('index/<int:year>/', views.index),# 新增代码
  7. ]

在浏览器中输入http://127.0.0.1:8000/app_01/index/2003/,观察现象,改变2003为其他年份数字,最后加入英文字符,观察现象。

转化器类型

Django默认支持以下5个转化器:

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

    自定义转换器类型

    django int类型转化器源码。

    1. class IntConverter:
    2. regex = '[0-9]+'
    3. def to_python(self, value):
    4. return int(value)
    5. def to_url(self, value):
    6. return str(value)

    分析:

  • regex 类属性,正则表达式

  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

示例:
创建一个年份的转换器类型。在app_01的路径下新建一个converters.py文件,写入下面代码。

  1. class YearConverter:
  2. regex = '[0-9]{4}'
  3. def to_python(self, value):
  4. return int(value)
  5. def to_url(self, value):
  6. return '%04d' % value

注册:
定义之后,需要register_converter函数将其注册在url中,才能正常使用。
将app_01——->urls.py中的代码改为如下所示。

  1. from django.urls import path, re_path, register_converter
  2. from django.conf.urls import url
  3. from . import views, converters
  4. register_converter(converters.YearConverter, 'yy')
  5. urlpatterns = [
  6. path('index/', views.index),
  7. # path('index/<int:year>/', views.index),
  8. path('index/<yy:year>/', views.index)
  9. ]

re_path匹配

处理path函数之外,django3.0还兼容url函数和re_path函数,通过正则语法来进行模糊匹配。

获取url中的有用信息

在Python正则表达式中,命名式分组语法为 (?Ppattern)。上述的代码可写成如下的形式。

  1. from django.urls import path, re_path, register_converter
  2. from django.conf.urls import url
  3. from . import views, converters
  4. register_converter(converters.YearConverter, 'yy')
  5. urlpatterns = [
  6. path('index/', views.index),
  7. # path('index/<int:year>/', views.index),
  8. # path('index/<yy:year>/', views.index),
  9. re_path('index/(?P<year>[0-9]{4})/', views.index),
  10. ]

反向解析url

我们有可能在其他领域需要url。django在三方面提供了保障。

  • 模板
  • Python代码
  • 数据库相关

模板:
通过在app_01———->urls.py中path函数中取别名的形式,我们可以在模板中通过url来使用。标准