当前位置: 首页 > news >正文

四十二、路由层

Django路由层

  • 一 django请求生命流程图
  • 二 Django如何处理一个请求
  • 三 2.2 路径转换器
  • 四 使用正则表达式
  • 五 使用未命名的正则表达式组
  • 六 URL的反向解析
    • 6.1 Django中URL会出现在什么位置?
    • 6.2 反向解析
  • 七 名称空间

一 django请求生命流程图

在这里插入图片描述

二 Django如何处理一个请求

下边是一个简单的路由匹配

# urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app01.urls'))
]
# app01\urls.py

from django.urls import path
from app01 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)
]
# app01\views.py

from django.shortcuts import render, HttpResponse


# Create your views here.

def special_case_2003(request):
    return HttpResponse('special_case_2003')


def year_archive(request, year):
    return HttpResponse(f'{year}')


def month_archive(request, year, month):
    return HttpResponse(f'{year}-{month}')


def article_detail(request, year, month, slug):
    return HttpResponse(f'{year}-{month}-{slug}')

注意:

  • 要从URL中取值,使用尖括号。
  • 捕获的值可以选择性的包含转换器类型。比如<int:year>来捕获整型参数。如果不包含转换器,则会匹配除了/外的任何字符。

一些请求的例子:

  • http://127.0.0.1:8000/app01/articles/2003/ 会匹配URL列表中的第一项。Django会调用views.special_case_2003(request)函数。
    在这里插入图片描述
  • http://127.0.0.1:8000/app01/articles/2022/9/ 会匹配URL列表中的第三项。Django会调用函数views.month_archive(request, year=2022,month=9)。
    在这里插入图片描述
  • http://127.0.0.1:8000/app01/articles/2022/9/HelloWorld/ 会匹配URL列表中的最后一项,Django会调用函数views.article_detail(request, year=2003, month=3, slug=“HelloWorld”) 。
    在这里插入图片描述

三 2.2 路径转换器

  • str - 匹配除了’ / '之外的非空字符串。如果表达式内不包含转换器,则会默认匹配字符串。
  • int - 匹配0或者任何正整数,返回一个int类型。
  • slug - 匹配任意由ASCII字母或数字以及连字符或下划线组成的短标签。
  • uuid - 匹配一个格式化的uuid。
  • path - 匹配非空字段,包括路径分隔符’ / '。允许匹配完整的路径而不像str那样匹配URL的一部分。

四 使用正则表达式

如果路径和转化器语法不能很好的定义你的URL模式,你可以使用正则表达式。

在python正则表达式中,命名正则表达式组的语法是 (?Ppattern) ,其中name是组名,pattern是要匹配的模式。

这里用先前的 app01\views.py 重写一下

# app01\urls.py

from django.urls import path, re_path
from app01 import views

urlpatterns = [
    # path('articles/2003/', views.special_case_2003),
    re_path('^articles/2003/$', views.special_case_2003),

    # path('articles/<int:year>/', views.year_archive),
    re_path('^articles/(?P<year>[0-9]{4})/$', views.year_archive),

    # path('articles/<int:year>/<int:month>/', views.month_archive),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.month_archive),

    # path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    re_path('^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<slug>[\w-]+/$)', views.article_detail)
]

实现了和前面大致相同的功能,无论正则表达式进行哪种匹配每个捕获的参数都作为字符串发送到视图中。

五 使用未命名的正则表达式组

命名组语法,例如 (?P[0-9]{4}) ,你也可以使用更短的未命名组,例如 ([0-9]{4}) 。

不是特别推荐这个用法,因为它会更容易在匹配的预期含义和视图参数之间引发错误。

在任何情况下,推荐在给定的正则表达式里只使用一个样式。当混杂两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。

六 URL的反向解析

6.1 Django中URL会出现在什么位置?

  • 模板(HTML)
    <a href=“url”> 超链接,点击跳转至该url
    <form action=“url” method=“post”> form表单中提交的数据以post请求发送至url
  • 视图函数中
    HttpResponseRedirect(‘url’) 将用户地址栏中的地址跳转到url

6.2 反向解析

从相应的 Django 视图标识以及要传递给它的参数来获取相关联的 URL 。

模板中通过URL实现地址反向解析。
示例一:

# urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', views.home),
    path('test_url/', views.test, name='t')
]
# views.py
def home(request):
    return render(request, 'test.html')


def test(request):
    return HttpResponse('test')
# test.html
<a href="{% url 't' %}" class="btn btn-info">url反向解析</a>

测试:
在这里插入图片描述
点击按钮:
在这里插入图片描述

示例二:

# urls.py中添加

path('test_url_1/<int:age>/', views.test2, name='t2')
# views.py

def test2(request, age):
    return HttpResponse(f'test2 age:{age}')
<a href="{% url 't2' '100'%} " class="btn btn-info">url反向解析测试2</a>

测试:
在这里插入图片描述
点击测试二按钮:
在这里插入图片描述

视图中通过reverse函数进行解析
示例:

	path('test_url_1/<int:age>/', views.test2, name='t2'),
    path('test_view_func/<int:year>/', views.view_func, name='view')
def test2(request, age):
    from django.urls import reverse
    url = reverse('view', kwargs={'year': age})
    from django.http import HttpResponseRedirect
    return HttpResponseRedirect(url)

测试:
在这里插入图片描述
点击测试2:
在这里插入图片描述
注意:当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值。

七 名称空间

有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1
名称空间

path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))

解决方式2
别名不冲突即可

相关文章:

  • python-(4-1)数据类型的应用(int、float、bool、字符串)
  • [Interview]Java 面试宝典系列之 Java 多线程
  • 纷享销客《2022新增长系列之快消行业橙皮书》重磅发布
  • 2023秋招面试准备
  • 【学习笔记】(数学)线性代数-矩阵的概念和特殊矩阵
  • 用ARM进行汇编语言编程(2)算数指令,CPSR寄存器与逻辑运算
  • 计算机毕业设计ssm趣评美食管理评论系统lrt3w系统+程序+源码+lw+远程部署
  • 《JavaScript从入门到精通》|变量作用域|垃圾回收|闭包【函数进阶篇】
  • 工程项目管理概述
  • 【Q-Learning】TD算法的一种
  • 【QT】Qt调用OCX控件详解
  • 设立“丰收杯”建设吨粮田 国稻种芯-株洲:破解种粮世界性难题
  • Linux内核设计与实现 第一章 Linux内核简介
  • dubbo java api
  • switch选择结构
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【技术性】Search知识
  • CentOS从零开始部署Nodejs项目
  • Hibernate【inverse和cascade属性】知识要点
  • httpie使用详解
  • k8s 面向应用开发者的基础命令
  • k个最大的数及变种小结
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • php中curl和soap方式请求服务超时问题
  • Selenium实战教程系列(二)---元素定位
  • windows-nginx-https-本地配置
  • 初识 beanstalkd
  • 初识 webpack
  • 关于springcloud Gateway中的限流
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 解析带emoji和链接的聊天系统消息
  • 跨域
  • 时间复杂度与空间复杂度分析
  • 《码出高效》学习笔记与书中错误记录
  • 2017年360最后一道编程题
  • FaaS 的简单实践
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (11)MSP430F5529 定时器B
  • (数据结构)顺序表的定义
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)c++ std::pair 与 std::make
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net生成的类,跨工程调用显示注释
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET下的多线程编程—1-线程机制概述
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • []FET-430SIM508 研究日志 11.3.31
  • [2016.7 day.5] T2
  • [Android Studio 权威教程]断点调试和高级调试
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BUUCTF 2018]Online Tool(特详解)