Python web实战之Django URL路由详解
概要
技术栈:Python、Django、Web开发、URL路由
Django是一种流行的Web应用程序框架,它采用了与其他主流框架类似的URL路由机制。URL路由是指将传入的URL请求映射到相应的视图函数或处理程序的过程。
什么是URL路由?
URL路由是Web开发中非常重要的概念,它将URL映射到特定的视图函数。在Django中,URL路由是由URLconf(URL配置)定义的。URLconf是一个Python模块,它定义了一个URL模式列表,每个URL模式都与一个视图函数相关联。
Django中的URL路由
在Django中,URL路由是通过正则表达式匹配URL模式来实现的。当一个URL请求到达Django应用程序时,Django将尝试将请求的URL与URLconf中的每个URL模式进行匹配。如果找到了匹配的URL模式,则它将调用与之相关联的视图函数。
在Django中定义URL模式的方法非常灵活,你可以使用简单的字符串匹配,也可以使用复杂的正则表达式。来看一个简单的示例:
# myapp/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('about/', views.about, name='about'),path('contact/', views.contact, name='contact'),
]
在上面的示例中,我们定义了三个URL模式:空URL模式(即根URL)将调用views.index函数,URL/about/将调用views.about函数,URL/contact/将调用views.contact函数。
正则表达式路由
除了简单的字符串匹配,Django还支持使用正则表达式来定义URL模式。这使得我们可以更加灵活地匹配不同类型的URL,例如带有参数的URL。
这一个带有参数的URL模式的示例:
# myapp/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('article/<int:article_id>/', views.article_detail, name='article_detail'),
]
上面的代码定义了一个URL模式,它将匹配形如/article/123/的URL。其中123是一个整数类型的参数,我们可以在views.article_detail函数中使用这个参数。
带命名空间的路由
在Django中,命名空间的路由是一种将URL模式组织和分组的方法,它允许你在一个应用程序中定义多个URL模式,同时避免与其他应用程序中的URL模式发生命名冲突。下面是一个使用命名空间的路由的示例:
假设我有一个名为blog的应用程序,我想要定义一些URL模式用于显示博客文章的详细信息和列表。可以在应用程序的urls.py文件中定义这些URL模式,并为这些URL模式指定一个命名空间。下面是blog应用程序的urls.py的代码:
from django.urls import path
from . import viewsapp_name = 'blog'urlpatterns = [path('', views.index, name='index'),path('<int:post_id>/', views.detail, name='detail'),path('category/<slug:category_slug>/', views.category, name='category'),path('tag/<slug:tag_slug>/', views.tag, name='tag'),
]
通过在urlpatterns列表之前定义app_name = 'blog'来指定命名空间。这个命名空间的名称是blog,它将被用作这个应用程序中所有URL模式的前缀。
例如,name='detail'指定了detail作为这个URL模式的名称,那么这个URL模式的完整名称将是blog:detail。我们可以在视图函数中使用这个完整名称来生成URL,例如:
from django.urls import reversedef my_view(request):url = reverse('blog:detail', args=[1])# url will be something like '/blog/1/'# ...
这个示例中演示了如何使用命名空间的路由来组织URL模式,并在视图函数中使用完整的URL名称来生成URL。
Django URL路由的最佳实践
在实际使用Django进行Web开发时,遵循一些最佳实践可以帮助我们更好地利用URL路由。
-
保持URL模式的简洁明了
尽可能地使URL模式简单明了。避免使用复杂的正则表达式,除非确实有必要。 -
保持URL和视图的一一对应
每个URL应该对应一个明确的视图。避免在一个视图中处理多个URL。 -
给URL命名
给每个URL都起一个有意义的名字,这样在代码中引用URL时就不需要记住实际的URL模式。
实战
现在来看一个实际的例子,假设我们要编写一个博客应用程序。我们需要定义一些URL模式来浏览文章、评论和作者信息,可以使用以下URL模式定义:
# myblog/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('posts/', views.post_list, name='post_list'),path('posts/<slug:slug>/', views.post_detail, name='post_detail'),path('authors/<int:pk>/', views.author_detail, name='author_detail'),path('comments/', views.comment_list, name='comment_list'),path('comments/<int:pk>/', views.comment_detail, name='comment_detail'),
]
这里定义了六个URL模式:
-
空URL模式将调用
views.index函数。 -
URL
/posts/将调用views.post_list函数,用于显示所有文章列表。 -
URL
/posts/slug/将调用views.post_detail函数,用于显示单篇文章的详细信息。 -
URL
/authors/pk/将调用views.author_detail函数,用于显示特定作者的详细信息。 -
URL
/comments/将调用views.comment_list函数,用于显示所有评论列表。 -
URL
/comments/pk/将调用views.comment_detail函数,用于显示特定评论的详细信息。
来看一下如何实现这些视图函数。这里我只展示views.post_list和views.post_detail函数的实现,其他视图函数的实现方法类似。
# myblog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Postdef index(request):return render(request, 'myblog/index.html')def post_list(request):posts = Post.objects.all()context = {'posts': posts}return render(request, 'myblog/post_list.html', context)def post_detail(request, slug):post = get_object_or_404(Post, slug=slug)context = {'post': post}return render(request, 'myblog/post_detail.html', context)
这里用了Django的模型管理器objects来获取所有文章列表,并将其传递给模板渲染。对于views.post_detail函数,使用get_object_or_404方法来获取特定的文章对象,并将其传递给模板渲染。
技术总结
今天我们深入探讨了Django的URL路由的应用,包括如何定义URL模式、如何使用正则表达式匹配URL模式、命名空间、最佳实践,并举例简单介绍了如何实现视图函数。
如果文章对你有所帮助,欢迎点赞收藏转发,感谢🙏
相关文章:
Python web实战之Django URL路由详解
概要 技术栈:Python、Django、Web开发、URL路由 Django是一种流行的Web应用程序框架,它采用了与其他主流框架类似的URL路由机制。URL路由是指将传入的URL请求映射到相应的视图函数或处理程序的过程。 什么是URL路由? URL路由是Web开发中非常…...
10-数据结构-队列(C语言)
队列 目录 目录 队列 一、队列基础知识 二、队列的基本操作 1.顺序存储 编辑 (1)顺序存储 (2)初始化及队空队满 (3)入队 (4)出队 (5)打印队列 &…...
面试之快速学习C++11 - 右值 移动构造 std::move
C11右值引用 字面意思,以引用传递的方式使用c右值左值和右值,左值是lvalue loactor value 存储在内存中,有明确存储地址的数据, 右值rvalue read value , 指的是那些可以提供数据值的数据(不一定可以寻址,…...
vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色
vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色 1、实现的效果 2、完整代码展示 <template><div id"app" mouseleave"handleMouseLeave({row: 0, col: 0 })"><div v-for"rowItem in squareNumber" :key"rowItem…...
2023-08-09 LeetCode每日一题(整数的各位积和之差)
2023-08-09每日一题 一、题目编号 1281. 整数的各位积和之差二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例1: 示例2: 提示: 1 …...
EditPlus连接Linux系统远程操作文件
EditPlus是一套功能强大的文本编辑器! 1.File ->FTP->FTP Settings; 2.Add->Description->FTP server->Username->Password->Subdirectory->Advanced Options 注意:这里的Subdirectory设置的是以后上传文件的默认…...
JVM 垃圾回收
垃圾回收算法 标记-清除算法(Mark and Sweep) 标记-清除算法分为两个阶段。在标记阶段,垃圾收集器会标记所有活动对象;在清除阶段,垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片&#…...
编程中的宝藏:二分查找
二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字(虽然现在谁还在用电话簿呢!)。你可以从头开始翻页,直到进入以 “K” 打头的部分。然而,更明智的方法是从中间开始,因为你知道以 “K” 打头…...
计算机网络 数据链路层
...
如何维护自己的电脑
目录 1、关于电脑选择的建议 1.1、价格预算 1.2、明确需求 1.3、电脑配置 1.4、分辨率 1.5、续航能力 1.6、品牌选择 1.7、用户评测 1.8、各个电商平台对比 1.9、最后决策 2、我的选择 3、电脑保养 3.1 外部清洁 3.2 安装软件 3.3 优化操作系统 3.4 维护硬件设…...
智能优化算法——哈里鹰算法(Matlab实现)
目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization,HHO),是由Ali As…...
【深度学习】多粒度、多尺度、多源融合和多模态融合的区别
多粒度(multiresolution)和多尺度(multiscale) 多粒度(multiresolution)和多尺度(multiscale)都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度࿱…...
利用SCCM进行横向移动
01SCCM介绍 SCCM全名为System Center Configuration Manager,从版本1910开始,微软官方将其从Microsoft System Center产品移除,重新命名为Microsoft Endpoint Configuration Manager(ConfigMgr),其可帮助 …...
Nginx 负载均衡
Nginx 负载均衡 负载均衡由反向代理来实现的 其中反向代理分为七层代理和四层代理,一般常用的是七层代理,接下来分别介绍一些 NGINX 七层代理 七层是最常用的反向代理方式,只能配置在Nginx配置文件的http模块。 配置方法名称:…...
Java课题笔记~ ServletConfig
概念:代表整个web应用,可以和程序的容器(服务器)来通信 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
oracle的异常处理
oracle提供了预定义例外、非预定义例外和自定义例外三种类型。其中: l预定义例外用于处理常见的oracle错误; l非预定义例外用于处理预定义所不能处理的oracle错误; l自定义例外处理与oracle错误无关的其他情况。 Oracle代码编写过程中&am…...
【MySQL】MySQL数据类型
文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…...
【数据结构与算法】十大经典排序算法-希尔排序
🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…...
docker 常用命令
1. 搜索并下载镜像 docker search bundlefusion # 搜索docker pull jhljx/bundlefusion # 将远程仓库文件下载到本地2. 用镜像创建容器 docker run -it --namebundlefusion colec777/bundlefusion-cu11.4-cudagl:v8 /bin/bash # 创建并运行 exit # 退出终端 sudo docker cont…...
uniapp微信小程序中打开腾讯地图获取用户位置信息
实现的效果 第一步:首先登录微信公众平台 , 需要用到AppID 第二步: 注册登录腾讯位置服务 注册需要手机号和邮箱确认,然后创建应用 创建后点击添加key 添加后会生成key,后面会用到这个key 第三步: 登录微信公众平台&a…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
