Python Django项目URL中包含另外一个urls模块

2023-10-26

在我们的项目中,不可能只有一个app,如果把所有的appviews中的视图都放在urls.py中进行映射,肯定会让代码显得非常乱。因此django给我们提供了一个方法,可以在app内部包含自己的url匹配规则,而在项目的urls.py中再统一包含这个appurls。使用这个技术需要借助include函数。示例代码如下:

# first_project/urls.py文件:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/',include("book.urls"))
]

urls.py文件中把所有的和book这个app相关的url都移动到app/urls.py中了,然后在first_project/urls.py中,通过include函数包含book.urls,以后在请求book相关的url的时候都需要加一个book的前缀。

# book/urls.py文件:

from django.urls import path
from . import views

urlpatterns = [
    path('list/',views.book_list),
    path('detail/<book_id>/',views.book_detail)
]

以后访问书的列表的url的时候,就通过/book/list/来访问,访问书籍详情页面的url的时候就通过book/detail/<id>来访问。

path函数:

path函数的定义为:path(route,view,name=None,kwargs=None)。以下对这几个参数进行讲解。

  1. route参数:url的匹配规则。这个参数中可以指定url中需要传递的参数,比如在访问文章详情页的时候,可以传递一个id。传递参数是通过<>尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型,比如文章的id都是int类型,那么可以这样写<int:id>,以后匹配的时候,就只会匹配到idint类型的url,而不会匹配其他的url,并且在视图函数中获取这个参数的时候,就已经被转换成一个int类型了。其中还有几种常用的类型:

    • str:非空的字符串类型。默认的转换器。但是不能包含斜杠。
    • int:匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
    • slug:由英文中的横杠-,或者下划线_连接英文字符或者数字而成的字符串。
    • uuid:匹配uuid字符串。
    • path:匹配非空的英文字符串,可以包含斜杠。
  2. view参数:可以为一个视图函数或者是类视图.as_view()或者是django.urls.include()函数的返回值。

  3. name参数:这个参数是给这个url取个名字的,这在项目比较大,url比较多的时候用处很大。

  4. kwargs参数:有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。比如以下的url规则:

from django.urls import path
 from . import views

 urlpatterns = [
     path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
 ]

那么以后在访问blog/1991/这个url的时候,会将foo=bar作为关键字参数传给year_archive函数。

re_path函数:

有时候我们在写url匹配的时候,想要写使用正则表达式来实现一些复杂的需求,那么这时候我们可以使用re_path来实现。re_path的参数和path参数一模一样,只不过第一个参数也就是route参数可以为一个正则表达式。
一些使用re_path的示例代码如下:

from django.urls import path, re_path

    from . import views

    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        re_path(r'articles/(?P<year>[0-9]{4})/', views.year_archive),
        re_path(r'articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
        re_path(r'articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-_]+)/', views.article_detail),
    ]

以上例子中我们可以看到,所有的route字符串前面都加了一个r,表示这个字符串是一个原生字符串。在写正则表达式中是推荐使用原生字符串的,这样可以避免在python这一层面进行转义。而且,使用正则表达式捕获参数的时候,是用一个圆括号进行包裹,然后这个参数的名字是通过尖括号<year>进行包裹,之后才是写正则表达式的语法。

include函数:

在项目变大以后,经常不会把所有的url匹配规则都放在项目的urls.py文件中,而是每个app都有自己的urls.py文件,在这个文件中存储的都是当前这个app的所有url匹配规则。然后再统一注册到项目的urls.py文件中。include函数有多种用法,这里讲下两种常用的用法。

1.include(pattern,namespace=None):直接把其他appurls包含进来。示例代码如下:

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

 urlpatterns = [
     path('admin/', admin.site.urls),
     path('book/',include("book.urls"))
 ]

当然也可以传递namespace参数来指定一个实例命名空间,但是在使用实例命名空间之前,必须先指定一个应用命名空间。示例代码如下:

# 主urls.py文件:
from django.urls import path,include
urlpatterns = [
    path('movie/',include('movie.urls',namespace='movie'))
]

然后在movie/urls.py中指定应用命名空间。实例代码如下:

from django.urls import path
from . import views

# 应用命名空间
app_name = 'movie'

urlpatterns = [
    path('',views.movie,name='index'),
    path('list/',views.movie_list,name='list'),
]

2.include(pattern_list):可以包含一个列表或者一个元组,这个元组或者列表中又包含的是path或者是re_path函数。

3.include((pattern,app_namespace),namespace=None):在包含某个appurls的时候,可以指定命名空间,这样做的目的是为了防止不同的app下出现相同的url,这时候就可以通过命名空间进行区分。示例代码如下:

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

 urlpatterns = [
     path('admin/', admin.site.urls),
     path('book/',include(("book.urls",'book')),namespace='book')
 ]

但是这样做的前提是已经包含了应用命名空间。即在myapp.urls.py中添加一个和urlpatterns同级别的变量app_name

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Django项目URL中包含另外一个urls模块 的相关文章

  • 在 sympy 绘图中,如何获得具有固定纵横比的绘图?

    如果我用这个片段画一个圆 from sympy import x y symbols x y p1 plot implicit Eq x 2 y 2 1 aspect ratio 1 1 我会得到一个像这样的图形窗口 现在长宽比不是我所期望
  • Python 如果 kwargs 中的 key 并且 key 为 true

    if force in kwargs and kwargs force is True 感觉应该有更好的方法来编写这个条件 因为我重复了键和变量 假设您确实想检查返回的关键字参数是否is True 这是另一种稍微不同的方式 if kwarg
  • matplotlib get_color 用于子图

    我正在按照这里的教程进行操作 https matplotlib org gallery ticks and spines multiple yaxis with spines html https matplotlib org galler
  • 硒网格监听节点端口而不是集线器端口

    对于我的测试 我在不同的端口上本地运行网格和节点 java jar usr bin selenium server jar port 4444 role hub java jar usr bin selenium server jar ro
  • matplotlib 的 pcolor 中的白线

    在某些 pdf 查看器 例如 OSX 上的 Preview 中 使用以下命令绘制的图matplotlib的 pcolor 有白线 见下图 我怎样才能摆脱它们 源代码非常简单 选择任何数据x y z import matplotlib mat
  • tkinter 上的“NoneType”对象没有属性“get”错误[重复]

    这个问题在这里已经有答案了 我最近开始使用 python 3 6 进行编码tkinter并尝试创建我自己的项目repl it 该项目是一个简单的交互式待办事项列表 但是我陷入困境并且无法使该功能正常工作 该函数只是简单地获取条目并将其添加到
  • Python绕相机轴旋转图像

    假设我有一个图像 是在对某些原始图像应用单应性变换 H 后获得的 未显示原始图像 将单应性 H 应用于原始图像的结果是该图像 我想围绕合适的轴 可能是相机所在的位置 如果有的话 将此图像旋转 30 度以获得此图像 如果我不知道相机参数 如何
  • gcloud app deploy:此部署有太多文件

    当我尝试通过 gcloud 部署我的 GAE 应用程序时 出现以下错误 Updating service default failed ERROR gcloud app deploy Error Response 400 This depl
  • 将Python嵌入到C中——导入模块

    我在使用嵌入式 Python for C 时遇到问题文档 http docs python org extending embedding html 每当我尝试使用导入的模块时 我都会得到 PythonIncl exe 中 0x1e089e
  • 确保特定列位于数据框中最后(或第一个)的最快方法是什么

    given df df pd DataFrame np arange 8 reshape 2 4 columns list abcd 假设我需要专栏 b 到最后 我可以做 df a c d b 但是确保给定列位于末尾的最有效方法是什么 这就
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 为什么Python 3中实例方法可以作为类方法调用?

    考虑下面的类 class Foo object def bar self print self 在Python 2中 2 7 13 调用bar 作为类方法引发异常 gt gt gt Foo bar hello Traceback most
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • Python 日志记录 - 如何检查记录器是否为空

    我刚刚在我的应用程序中实现了日志记录 我想知道是否有一种方法可以检查记录器是否为空 我的想法是在我的脚本中设置两个处理程序 一个用于带水平仪的控制台WARNING 一个用于带级别的文件DEBUG 在脚本的最后 我需要检查是否CONSOLE记
  • Kivy错误(python 2.7):sdl2导入错误

    我尝试在我的 Python 2 7 项目 在 PyCharm Windows 10 环境中 上使用 kivy 但出现以下错误 如果有人可以帮助我吗 谢谢 PS 我多次尝试卸载 重新安装库等 并按照像这样的帖子上的建议进行操作 但它不起作用
  • pygame.image.load 不工作

    我正在尝试为游戏创建世界地图 但是当我尝试将世界地图加载到屏幕上时 命令行告诉我无法执行此操作 这是代码 import sys import pygame from pygame locals import pygame init Surf
  • 如何在Python中一次比较二维数组的2列与另一个数组的列

    我有两个字符串数组 每个数组有三列 我想比较两个二维数组的前两列 有 3 列和 4000 行 如果它们匹配 那么我需要那些匹配的值 但是我的代码不起作用 这是一个示例 array1 1stcolumn 2ndColumn 3rdColumn
  • 按键合并的两个字典的值的并集

    我有两本词典 d1 a x y b k l d2 a m n c p r 如何合并这两个字典以获得这样的结果 d3 a x y m n b k l c p r 当字典的值是简单类型 如 int 或 str 时 这有效 d3 dict i a
  • 如何在Python中仅列出顶级目录?

    我希望能够仅列出某个文件夹内的目录 这意味着我不需要列出文件名 也不需要其他子文件夹 让我们看看一个例子是否有帮助 在当前目录中我们有 gt gt gt os listdir os getcwd cx Oracle doc DLLs Doc
  • Django Python - LDAP 身份验证

    我目前正在研究 Django Python 我的目标是从 Ldap 目录对用户进行身份验证 我确实有 python 代码来访问 ldap 目录并检索信息 Code import ldap try l ldap open ldap forum

随机推荐

  • 冒泡排序算法的Java实现及优化

    冒泡排序是一种简单但效率较低的排序算法 它通过多次交换相邻元素的位置来实现排序 本篇博客将介绍如何使用Java编程语言实现冒泡排序算法 并对其进行优化 首先 让我们来了解一下冒泡排序的基本原理 冒泡排序的思想是从数组的起始位置开始 比较相邻
  • Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1 简介 Stream流 最全的用法 Stream 能用来干什么 用来处理集合 通过 使用Stream API 对集合数据进行操作 就类似于使用 SQL 执行的数据库查询 Stream API 提供了一种
  • 统计学——卡方检验和卡方分布

    什么是卡方检验 卡方检验是一种用途很广的计数资料的假设检验方法 它属于非参数检验的范畴 主要是比较两个及两个以上样本率 构成比 以及两个分类变量的关联性分析 其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题 它在分类资料统计
  • 目标检测标注原则

    算力和数据是影响深度学习应用效果的两个关键因素 在算力满足条件的情况下 为了到达更好的效果 我们需要将海量 高质量的素材数据喂给神经网络 训练出高精度的网络模型 吴恩达在深度学习公开课中提到 在算力满足要求的前提下 模型效果会随着素材数量的
  • vue事件绑定、事件参数、事件修饰符、表单双向绑定、监听器、计算属性

    目录 事件绑定 事件参数 事件修饰符 表单 watch 监听器 监听属性 computed 计算属性 面试题 事件机制 概述 在dom阶段 我们已经讲述了事件机制的特点 事件三要素 事件绑定 事件流 事件对象 事件代理 事件类型 这些概念在
  • ISAKMP - 安全关联协商

    前面说过 ISAKMP主要有三个过程 SA协商 密钥交换和认证 本篇主要讨论SA协商 首先要明白一个问题 为什么需要协商 为什么协议不规定使用某种特定的算法 这样实现上可以变得简单很多 要回答这个问题 我们必须全面的审视网络通信的环境 所有
  • Redis中常用命令:基本+五种基本类型(string、list、hash、set、zset)+三种特殊类型(geospatial、hyperloglog、bitmap)

    redis的命令有很多 命令不区分大小写 如下是一些常用的命令 可以通过官网 命令来学习使用更多的命令 例如 1 基本命令 选择数据库select 编号 redis默认的数据库有16个 编号从0 15 默认使用0号数据库 在配置文件中可查看
  • Elasticsearch(三)使用 Kibana 操作 ES

    文章目录 下载 Kibana 镜像 启动 Kibana 容器 索引 分片和副本 索引 索引分片 索引副本 创建索引 映射 数据结构 字段的数据类型 创建映射 查看映射 添加文档 删除文档 删除索引 下载 Kibana 镜像 docker p
  • Deep Java Library(DJL)上手指南

    Deep Java Library DJL https djl ai 是一个Java语言编写的深度学习库 平台 支持各种已有的模型直接导入 受益于Java的跨平台和高性能 相对Python DJL可以很容易部署和高效率运行 尤其是推理 首先
  • uc3842改可调电源教程_《学习笔记》--DC/DC电源电路设计实例

    1 设计概述 利用LTC3704实现3 3V 1 5V的转换 最大输出电流1A LTC3704是一款支持正向电源电压转换为负向电源电压的DC DC电源芯片 支持的输入端电源电压范围是2 5V 36V 输出端电源电压可调 2 引脚介绍 VIN
  • 若依前端后端框架 分离切换用户问题解决!学不会得找我!!!

    笔者最近遇到一个问题 就是有主账号一个字段 有多个从账号 基于这个目的用户表登录名是从账号得登录名 而有一个字段为主账号 识别是这个人 若依前后端 看了官网 都是用userName去鉴权 然后生成token和JWT数据 所有userName
  • todolist 案例 JavaScript

    css样式 body margin 0 padding 0 font size 16px background CDCDCD header height 50px background 333 background rgba 47 47 4
  • VUE 巧用$attrs和inheritAttrs提高组件的可扩展性

    VUE 巧用 attrs和inheritAttrs提高组件的可扩展性 前言 在平时创建组件时 一般使用的是利用props传值 然后通过传入的值再赋给标签的方式 来控制组件里的 这种方法在使用时的可扩展性不大 很难通过外部来动态的往组件内部添
  • java学习笔记(第7天:形参和返回值)

    目录 一 形参和返回值都是基本类型 二 类名作为形参和返回值 三 抽象类作为形参和返回值 四 接口作为形参和返回值 一 形参和返回值都是基本类型 这里比较简单 放一个不确定参数数量的例子玩玩 package Demo public clas
  • 关于Unity游戏开发场景切换:Time.timeScale的捣乱

    在制作场景切换功能的时候 我用的是SceneManager LoadScene函数 从主界面场景切换到关卡1场景 从关卡1场景切换到关卡2场景都是没有问题的 但是 当我在点击Pause按钮来到暂停界面 点击Back Menu按钮准备回到主界
  • LR和线性回归的区别与联系

    区别 区别 线性回归 liner regression LR logistics regression 构建方法 最小二乘法 似然函数 解决问题 主要解决回归问题 也可以用来分类 但是鲁棒性差 解决分类问题 输出 输出实数域上连续值 输出值
  • 在#define中使用参数

    在 define中使用参数 在 define中使用参数可以创建外形和作用与函数类似的类函数宏 例如 define SQUARE X X X 在程序中可以这样用 z SQUARE 2 这看上去像函数调用 但它的行为与函数调用完全不同 预处理器
  • 网关Gateway-快速上手

    gateway网关官方文档 https docs spring io spring cloud gateway docs current reference html 网关的概念 网关作为流量的入口 常用的功能包括路由转发 权限校验 限流等
  • 单片机:按键(使用中断)控制数码管的数字加减(c语言实现)

    本实验的目的 使用中断实现通过编号为8和C的按键控制数码管数字的加减 加至15之后再循环到0 减到0之后保持0不变 include
  • Python Django项目URL中包含另外一个urls模块

    在我们的项目中 不可能只有一个app 如果把所有的app的views中的视图都放在urls py中进行映射 肯定会让代码显得非常乱 因此django给我们提供了一个方法 可以在app内部包含自己的url匹配规则 而在项目的urls py中再