Django框架——路由

news2025/4/28 10:57:03

上篇文章我们学习了Django框架——请求与响应,这篇文章我们学习Django框架——路由。本次学习过程中使用的项目目录如下图所示:

大家放心,这个是新建的Django项目,还没编写任何代码,这里展示目录是为了大家更好地理解本次学习的内容。

注意:该项目不是自己手动新建文件来创建的,大家可以参考这篇文章来创建——第一个Django程序。

路由

相信大家对路由都不陌生,我们日常浏览的网页、网页中显示的内容都是通过路由技术使用URL链接来获取的。在Django框架中主要通过视图函数views.py与路由urls.py进行搭配,从而完成URL路由绑定。

首先在views.py文件中编写视图函数,该函数代码如下:

from django.http import HttpResponse
def Welcome(request):
    return HttpResponse("欢迎学习Djang框架之路由")

该视图函数名为Welcome,返回的内容为字符串:欢迎学习Djang框架之路由。编写视图函数后,在urls.py文件中通过path方法使用该路由文件,path语法格式如下:

path('路由地址/',视图函数,name='别名')  # 别名是可有可无
path('路由地址/<数据类型:数据名>/',视图函数,name='别名')  # 传参写法

示例代码如下:

from django.contrib import admin
from django.urls import path
from App.views import *   # 导入视图函数

urlpatterns = [
    path('admin/', admin.site.urls),
    path('welcome/',Welcome)  # URL绑定视图函数
]

在urls.py中通过path方法使url路径与视图函数进行绑定,接下来我们通过如下代码启动Django程序,

python manage.py runserver

启动后访问http://127.0.0.1:8000/welcome/即可获取到视图函数返回的内容,好了,最基础的URL路由绑定就是这样。

除了通过path绑定视图函数和url,还可以通过正则匹配re_path绑定,示例代码如下:

re_path(r'Repath/(?P<a>\d+)/(?P<b>\d+)/',Welcome,name='Welcome')

re_path绑定已经很少使用了,这里简单知道有re_path绑定即可。

路由分发

在实际的开发过程中,一个完成的项目肯定会包含很多app,假如我们将所有app的url路由绑定都写在主路由Django.urls.py文件中,会显得杂乱无章、可维护性、可读性差,如下图所示:

这时我们可以在每个app里面创建各自的urls.py路由文件,每个urls.py绑定各自的视图函数,如下图所示:

从主路由出发,将app所属的URL请求转发到相应的urls.py模块中,这与Flask框架中的蓝图类似,在Django框架中叫做路由分发。

首先在App文件夹中创建urls.py文件,该文件内容如下:

from django.urls import path
from App.views import *

urlpatterns = [
    path('welcome/',Welcome)
]

注意:urls.py的路由配置必须是urlpatterns,不能随意更改!

接下来在Django文件夹中的urls.py文件通过include方法中调用App中的urls.py文件,include语法格式如下:

path('路由地址/',include('子路由'))
path('路由地址/',include(('子路由','App名字'),namespace='命名空间名'))  # 命名空间名可以是任意的

示例代码如下:

from django.contrib import admin
from django.urls import path, include
from App.views import *

urlpatterns = [
    path('App/',include('App.urls')),  # 使用App中的urls路由
    # path('App/',include(('App.urls','App'),namespace='Apps'))  #命名空间写法:使用App中的urls路由
    path('admin/', admin.site.urls),
]

这里我们根路由的文件夹为App,所以在include中的参数为App.urls,App名字为App。接下来我们只要访问http://127.0.0.1:8000/App/welcome/即可获取到子路由视图函数返回的内容。

路由传参

在上面的示例中,URL没有传递参数,当我们访问需要传递参数的URL时,需要在视图函数和url.py文件中修改代码,视图函数示例代码如下:

def getCan(request,a,b):
    return HttpResponse(f'姓名:{a} 年龄:{b}')

在App文件夹中urls.py添加如下代码:

path('GetCan/<str:a>/<int:b>/',getCan)

当我们访问http://127.0.0.1:8000/App/GetCan/张三/33/,即可返回内容为:姓名:张三 年龄:33的页面。

这样就成功传递了参数,传递的参数类型主要有int和str。

注意:在视图函数中参数位置和访问的URL传递的参数无关,例如:将上面的视图函数改为:

def getCan(request,b,a):
    return HttpResponse(f'姓名:{a} 年龄:{b}')

访问http://127.0.0.1:8000/App/GetCan/张三/33/,返回的内容还是姓名:张三 年龄:33

反向解析

当我们访问http://127.0.0.1:8000/App/welcome/时,在正常的解析过程:先在Django的urls.py文件中找到App/路径,在App/路径获取到子路由位置,根据子路由找到welcome路径,并找到该路径绑定的视图函数,从而获取视图函数的响应,如下图所示:

反向解析是通过别名直接在子路由中获取到视图函数,如图下所示:

首先在templates文件夹中添加index.html,该文件代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="/App/Fan/">正常进入</a>
    <hr />
    <a href="{%  url 'FanXiang'%}" >反向解析进入</a>
</body>
</html>

在views.py文件中添加如下代码:

def index(request):
    return render(request,'index.html')

def getFan(request):
    return HttpResponse('反向解析')

再在App文件夹中urls.py添加如下代码:

path('index/',index),
path('Fan/', getFan,name='FanXiang')

当我们访问http://127.0.0.1:8000/App/index/,不管点击哪个链接,都可以进入http://127.0.0.1:8000/App/Fan/。

反向解析可以在我们修改url时,避免代码中的硬编码依赖,同时提高可读性和可维护性。

命名空间

在实际开发中,Django中可能存在多个应用程序App,每个应用程序都可能有自己的路由模块,为了防止路由冲突,Django提供了命名空间(namespace)的概念,命名空间是一种将路由命名为层次结构的方式,使得在查询路由时,可以限定在该命名空间内。

在Django文件夹urls.py文件中,将path('App/',include('App.urls')),代码修改为:

    path('App/',include(('App.urls','App')),namespace='Apps'),

修改后,上面反向解析示例中的index.html文件的{% url 'FanXiang'%}修改为:

{%  url 'Apps:FanXiang'%}

注意:当我们使用了命名空间,所有用到别名的地方,命名空间名。

重定向

重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向),在Django中,重定向主要使用了redirect和reverse方法,其语法格式如下:

redirect('URL路径')  
redirect(reverse('别名'))
redirect(reverse('别名',args=[参数,]))  # 固定位置传参
redirect(reverse('别名',kwargs={"参数键":'参数值'})) # 指定参数传参

视图函数views.py添加如下代码:

from django.shortcuts import redirect,reverse

def getRedirect(request):
    # return redirect('/App/index/')
    # return redirect(reverse('Apps:FanXiang'))
    # return redirect(reverse('Apps:getCan',args=['张三',33]))
    return redirect(reverse('Apps:getCan',kwargs={'a':'张三','b':33}))

App文件夹urls.py文件示例代码如下:

from django.urls import path
from App.views import *

urlpatterns = [
    path('welcome/',Welcome),
    path('GetCan/<str:a>/<int:b>/',getCan,name='getCan'),
    path('index/',index),
    path('Fan/', getFan,name='FanXiang'),
    path('redirect/', getRedirect, name='redirect')
]

接下来大家访问http://127.0.0.1:8000/App/redirect/即可重定向。

好了,Django框架——路由就学习到这里,下篇文章我们学习Django框架——模版。

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器等相关文章!

- END -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣大厂热门面试算法题 - 矩阵

解数独&#xff0c;单词搜索&#xff0c;被围绕的区域。每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.07 可通过leetcode所有测试用例。 目录 37. 解数独 解题思路 完整代码 Python Java 79. 单词搜索 解题思路 完整代码 Python…

金融行业数据安全面临的问题及解决办法

金融行业包括商业银行业务、证券业务、保险业务、基金业务、信托业务等&#xff0c;因此数据类型多种多样&#xff0c;并且数据涉及主体众多&#xff0c;应用场景上较为多样复杂&#xff0c;在数据交换上存在安全、合规、可控、可靠、高效等需求。首先&#xff0c;我们来看一下…

c++初阶------类和对象(六大默认构造函数的揭破)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

部署YOLOv8模型的实用常见场景

可以的话&#xff0c;GitHub上点个小心心&#xff0c;翻不了墙的xdm&#xff0c;csdn也可以点个赞&#xff0c;谢谢啦 车流量检测&#xff08;开源代码github&#xff09;&#xff1a; test3 meiqisheng/YOLOv8-DeepSORT-Object-Tracking (github.com) 车牌检测&#xff0…

代码随想录算法训练营第11天

20. 有效的括号 方法&#xff1a; 1. 如果 !st.empty() return false2.如果st.top() ! s[i] return false3. 如果 st.empty() return false注意&#xff1a; 以下这种写法 不满足 题目要求的第二点&#xff0c;不能以正确的顺序闭合 if(s[i] st.top()){return true;s…

openssl调试记录

openssl不能直接解密16进制密文&#xff0c;需要把密文转化成base64格式才能解密 调试记录如下&#xff1a;

【必读】产品经理必须要熟练掌握的五类产品管理框架

产品管理从其传统根源已经走过了很长一段路&#xff0c;不断发展以适应现代企业的步伐和需求。随着产品变得更加复杂&#xff0c;用户的需求更加细致&#xff0c;用于指导这些产品的框架需要升级。请阅读本文&#xff0c;深入了解从字面上看改变了产品管理游戏规则的结构。 01.…

越南、泰国发稿案例分析:CloudNEO专家级海外新闻传播矩阵

在东南亚地区&#xff0c;越南和泰国作为经济增长迅速、市场潜力巨大的国家&#xff0c;吸引着越来越多的国际企业进驻和投资。在这个充满机遇和挑战的市场中&#xff0c;有效的新闻传播成为企业赢得市场份额和建立品牌形象的关键一环。CloudNEO作为专业的海外新闻传播服务提供…

事务 失效的八种情况

在某些业务场景下&#xff0c;如果一个请求中&#xff0c;需要同时写入多张表的数据。为了保证操作的原子性&#xff08;要么同时成功&#xff0c;要么同时失败&#xff09;&#xff0c;避免数据不一致的情况&#xff0c;我们一般都会用到 spring 事务。 确实&#xff0c;sprin…

docker-compose Install ONLYOFFICE

ONLYOFFICE 前言 ONLYOFFICE 是一款全面的协作办公软件套件,集成了文档处理、电子表格和演示文稿等功能,为团队提供了无缝协作的工作环境。其功能强大,操作简便,是各种规模和类型的团队的首选工具。 功能介绍 多人协作:ONLYOFFICE 提供实时协作功能,让团队成员可以同时…

【设计模式 04】建造者模式

如果要构建的对象很复杂&#xff0c;那么可以将整个构建过程拆分成多个步骤&#xff0c;并为每一个步骤定义一个抽象的接口。并添加一个指导者用来控制构建产品的顺序和步骤。 Java实现&#xff1a; // 产品类 class Product {private String part1;private String part2;pub…

vue3+ts项目创建 使用npm create vue@latest

npm create vuelatest相关创建代码&#xff1a;

android基础学习

从上面的描述就可以知道&#xff0c;每一个Activity组件都有一个对应的ViewRoot对象、View对象以及WindowManager.LayoutParams对象。这三个对象的对应关系是由WindowManagerImpl类来维护的。具体来说&#xff0c;就是由WindowManagerImpl类的成员变量mRoots、mViews和mParams所…

onnxruntime模型部署(二)C++部署手写数字识别

导出onnx模型 模型链接&#xff1a; 夸克网盘链接 百度网盘链接&#xff0c;提取码&#xff1a;8fkb 环境配置 OpenCV配置 自行百度 onnxruntime C版配置 有两种方法&#xff0c;一种是下载源码自己编译&#xff0c;还有一种是使用预编译好的文件。众说周知&#xff0c;…

Vue深度教程

一、Vue简介 1.简介 2.快速上手 二、基础 1.创建一个Vue应用 2.模板语法 3.响应式基础 4.计算属性 5.Class与 Style绑定 6.条件渲染 7.列表渲染 8.事件处理 9.表单输入绑定 10.生命周期钩子 11.侦听器 12.模板引用 13.组件基础 三、深入组件 1.组件注册 2.Props 3.组件事件 …

xinput1_3.dll丢失都有什么办法可以有效的解决、xinput1_3.dll导致游戏不能启动怎么办?

使用电脑的过程中是不是会遇到关于某个dll文件丢失的提示&#xff0c;今天想和大家聊的是xinput1_3.dll文件&#xff0c;如果电脑提示xinput1_3.dll丢失有什么办法可以有效的解决&#xff0c;解决办法都有哪些&#xff0c;如果xinput1_3.dll丢失会对电脑有什么影响。&#xff0…

详解高质量增长的关键动力:ABM、数据、AI与业财融合

企业要穿越周期&#xff0c;不能仅靠节衣缩食&#xff0c;增长与盈利仍是必须。当盲目做大规模无法带来可持续发展&#xff0c;高质量增长便成为必须。在降本增效之上&#xff0c;企业需要变革增长模式。 在纷享销客的《领创者》开年直播上&#xff0c;纷享销客联合创始人、经…

OpenHarmony下musl编译工具链普法

OpenHarmony下musl编译工具链普法 引言 欠的债总是要还的&#xff0c;这不前面欠的关于OpenHarmony下musl相关的还是要还的。这里我对其中的相关知识点&#xff0c;梳理&#xff0c;归纳重新消化下&#xff01; 一.GCC/Clang/LLVM的区别与联系 说实话&#xff0c;这块我现在都…

streamlit学习-如何播放HLS视频(streamlit嵌入html)

streamlit学习-如何播放HLS视频 一.效果二.直播环境搭建(仅供演示)1.生成m3u82.搭建http服务器(支持跨域)3.验证hls(VLC播放 http://localhost:8000/playlist.m3u8) 三.streamlit demo 本文演示了streamlit如何实现hls直播[streamlit中嵌入html] 一.效果 二.直播环境搭建(仅供演…

vue+Nodejs+Koa搭建前后端系统(九)-- 上传图片

web2.0的到来使网页世界正式进入了寒武纪&#xff0c;各式各样的多媒体资源屡见不鲜&#xff0c;上传资源变得刻不容缓&#xff01; 前言 本文是在该系列的基础上&#xff0c;针对前后端代码的修改。 准备 HTTP上传图片时Content-Type值常见的有2种&#xff1a;application…