专栏名称: AirPython
分享 Python 自动化及爬虫、数据分析实战干货,欢迎关注。
目录
相关文章推荐
51好读  ›  专栏  ›  AirPython

Django 系列篇(五):路由篇(中)

AirPython  · 公众号  ·  · 2020-04-22 08:03

正文

点击上方“ AirPython ”,选择“ 加为星标

第一时间关注Python技术干货!



系列导读


01. Django 系列篇(一):Hello World!

02. Django 系列篇(二):配置篇(上)

03. Django 系列篇(三):配置篇(下)

04. Django 系列篇(四):路由篇(上)

1. 路由变量

上面 Django 定义的路由只能代表一个页面,为了使路由指向多个不同的页面,可以在路由中定义变量

变量类型有:整形、字符串、slug、uuid  4 种

其中:

1、字符串:匹配任何非空字符串,但不包含斜杠,默认使用字符串类型

2、整形:匹配任何非负数

3、slug:匹配 ASCII 字符以及连接线和下划线,可理解为注释、后缀或附属等概念

4、uuid:匹配一个 uuid 格式的对象,为了防止路由冲突,所有字母必须小写,然后用 - 连接起来,比如: 0755-2323-1111-abcd-3f3g

以匹配年、月、日的视图为列

首先,在 App 的路由集合下新增一条路由信息

# urls.py(App)

# 指向日期视图函数
# year:字符串
# month:整形
# day:slug类型
path('//', views.ymd_with_params),

其中,使用变量符号 <> 为路由设置变量,: 之前代表变量类型,: 之后代表变量名;如果没有指定变量类型,默认为字符串类型

然后,在 App 下的 view.py 文件中编写路由定义的视图函数

视图函数中包含 4 个参数,其中第 1 个参数为:request,其他 3 个参数为:路由信息包含的 3 个变量

需要注意的是, 视图函数的参数必须和路由信息包含的变量一一对应,否则会抛出异常

# views.py(App)

def ymd_with_params(request, year, month, day):
    """
    日期视图函数
    :param request:
    :return:
    """

    result = str(year) + '/' + str(month) + "/" + str(day)
    return HttpResponse(result)

最后运行项目,在浏览器下输入路由地址,比如: http://127.0.0.1:8000/2020/04/20

2. 额外变量

除了在路由地址中设置变量外,还可以为 path 函数追加一个变量

需要注意的是, 变量必须以字典的形式表示,参数值不限制数据格式,可以是实体对象,也可以是基本数据类型

# urls.py(App)

# 新建一个路由地址airpython
# 指向视图函数with_extra_params
# 并带有参数,参数通过字典定义
path('airpython', views.with_extra_params, {'extra_param''AirPython'}),

然后,在视图函数 with_extra_params() 中来使用这个参数

# views.py(App)

def with_extra_params(request, extra_param):
    """
    带额外的参数
    :param request:
    :param extra_param:
    :return:
    """

    return HttpResponse('Welcome to attention ' + extra_param)

3. 正则表达式

正则表达式可以限制路由地址中的变量取值范围,对路由变量进行截取与判断,使得路由匹配更加地精确合理

路由正则表达式使用函数 re _path 来定义,以小括号 ( ) 为一个部分单位,每个小括号以 ?P 开头,加入正则表达式,最后通过斜杠 / 隔开即可

上面的路由地址可以通过正则表达式改写为:

# 路由正则表达式
# 函数:re_path(路由地址,视图函数)
# 路由地址:year、month、day为3个参数
re_path('(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2}).html',views.ymd_with_params1)

其中, 用 < > 包住 的 year、month、day 为 3 个变量

接着定义视图函数,运行项目,就可以通过地址访问到视图函数渲染的内容。

def ymd_with_params1(request,year, month, day):
    """
    日期视图函数(正则表达式)
    :param request:
    :param year:
    :param month:
    :param day:
    :return:
    """

    result = str(year) + '/' + str(month) + "/" + str(day)
    return HttpResponse(result)

4. 命名空间

随着网页的数目增加,维护会有一定难度,因此,Django 可以为每一条路由设置命名空间,方便我们更好地管理网站

通过查看源码,发现路由函数 include() 有两个参数,分别是: arg、namespace ,其中 namespace 代表路由的命名空间,为可选参数; arg 参数类型为字符串或元组(长度为:2 ) ,作用是指向项目某一个 App 的 urls.py 文件

需要注意的是:

1、如果路由函数不存在命名空间,arg 的数据格式是字符串,比如:first_app.urls,指向 first_app 这个 App 的 urls.py 路由文件

2、 如果路由函数命名空间存在,arg 的数据格式一定要设置为长度为 2 的元组 ,比如:(' first_app .urls ','first_app'),其中第一个参数为目标 App 的 urls.py 文件,第二个参数一般设置为 App 的名称

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    # 指向admin后台系统的路由文件
    path('admin/', admin.site.urls),

    # 指向first_app的路由文件:urls.py
    # namespace:设置路由的命令空间






请到「今天看啥」查看全文