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

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模式:

  1. 空URL模式将调用views.index函数。

  2. URL/posts/将调用views.post_list函数,用于显示所有文章列表。

  3. URL/posts/slug/将调用views.post_detail函数,用于显示单篇文章的详细信息。

  4. URL/authors/pk/将调用views.author_detail函数,用于显示特定作者的详细信息。

  5. URL/comments/将调用views.comment_list函数,用于显示所有评论列表。

  6. URL/comments/pk/将调用views.comment_detail函数,用于显示特定评论的详细信息。

来看一下如何实现这些视图函数。这里我只展示views.post_listviews.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路由详解

概要 技术栈&#xff1a;Python、Django、Web开发、URL路由 Django是一种流行的Web应用程序框架&#xff0c;它采用了与其他主流框架类似的URL路由机制。URL路由是指将传入的URL请求映射到相应的视图函数或处理程序的过程。 什么是URL路由&#xff1f; URL路由是Web开发中非常…...

10-数据结构-队列(C语言)

队列 目录 目录 队列 一、队列基础知识 二、队列的基本操作 1.顺序存储 ​编辑 &#xff08;1&#xff09;顺序存储 &#xff08;2&#xff09;初始化及队空队满 &#xff08;3&#xff09;入队 &#xff08;4&#xff09;出队 &#xff08;5&#xff09;打印队列 &…...

面试之快速学习C++11 - 右值 移动构造 std::move

C11右值引用 字面意思&#xff0c;以引用传递的方式使用c右值左值和右值&#xff0c;左值是lvalue loactor value 存储在内存中&#xff0c;有明确存储地址的数据&#xff0c; 右值rvalue read value , 指的是那些可以提供数据值的数据&#xff08;不一定可以寻址&#xff0c;…...

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&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例1&#xff1a; 示例2&#xff1a; 提示&#xff1a; 1 …...

EditPlus连接Linux系统远程操作文件

EditPlus是一套功能强大的文本编辑器&#xff01; 1.File ->FTP->FTP Settings&#xff1b; 2.Add->Description->FTP server->Username->Password->Subdirectory->Advanced Options 注意&#xff1a;这里的Subdirectory设置的是以后上传文件的默认…...

JVM 垃圾回收

垃圾回收算法 标记-清除算法&#xff08;Mark and Sweep&#xff09; 标记-清除算法分为两个阶段。在标记阶段&#xff0c;垃圾收集器会标记所有活动对象&#xff1b;在清除阶段&#xff0c;垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片&#…...

编程中的宝藏:二分查找

二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字&#xff08;虽然现在谁还在用电话簿呢&#xff01;&#xff09;。你可以从头开始翻页&#xff0c;直到进入以 “K” 打头的部分。然而&#xff0c;更明智的方法是从中间开始&#xff0c;因为你知道以 “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&#xff0c;HHO)&#xff0c;是由Ali As…...

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09; 多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09;都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…...

利用SCCM进行横向移动

01SCCM介绍 SCCM全名为System Center Configuration Manager&#xff0c;从版本1910开始&#xff0c;微软官方将其从Microsoft System Center产品移除&#xff0c;重新命名为Microsoft Endpoint Configuration Manager&#xff08;ConfigMgr&#xff09;&#xff0c;其可帮助 …...

Nginx 负载均衡

Nginx 负载均衡 负载均衡由反向代理来实现的 其中反向代理分为七层代理和四层代理&#xff0c;一般常用的是七层代理&#xff0c;接下来分别介绍一些 NGINX 七层代理 七层是最常用的反向代理方式&#xff0c;只能配置在Nginx配置文件的http模块。 配置方法名称&#xff1a;…...

Java课题笔记~ ServletConfig

概念&#xff1a;代表整个web应用&#xff0c;可以和程序的容器(服务器)来通信 <?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提供了预定义例外、非预定义例外和自定义例外三种类型。其中&#xff1a; l预定义例外用于处理常见的oracle错误&#xff1b; l非预定义例外用于处理预定义所不能处理的oracle错误&#xff1b; 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_…...

【数据结构与算法】十大经典排序算法-希尔排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…...

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微信小程序中打开腾讯地图获取用户位置信息

实现的效果 第一步&#xff1a;首先登录微信公众平台 , 需要用到AppID 第二步&#xff1a; 注册登录腾讯位置服务 注册需要手机号和邮箱确认&#xff0c;然后创建应用 创建后点击添加key 添加后会生成key&#xff0c;后面会用到这个key 第三步&#xff1a; 登录微信公众平台&a…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; 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 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [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 解决&#xff1a; 不要动CMakeLists.…...