Django基础入门⑧:Django路由详细讲解

这篇具有很好参考价值的文章主要介绍了Django基础入门⑧:Django路由详细讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。


Django路由

路由分发函数

在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发,而它的实现是使用include() 函数来完成的

include是Django路由系统的一个重要组成部分,它允许我们将一个应用程序的URL模式与另一个应用程序的URL模式组合在一起,从而创建更复杂的URL映射。我们可以使用include函数在urlpatterns中嵌套URL配置。

使用include的通用语法如下:

path('prefix/', include('app.urls')),
  • 其中,prefix是目标URL前缀,app.urls是目标应用程序的URL配置模块。
  • 通过include,我们可以将多个Django应用程序相互分离,每个应用程序负责处理其内部的URL。但是,如果某个URL模式需要跨越应用程序,则可以使用include将多个应用程序内的URL组装起来。

例如,假设我们有两个应用程序,一个名为blog,一个名为news(需要注册app到项目中)。blog应用程序处理所有博客相关的URL,news应用程序将管理所有新闻相关的URL。为了构建这些应用程序的URL,我们可以使用Django的include函数,将它们组合到一个目录下。

首先,我们需要在blog应用程序中定义自己的URL模式:

# blog/urls.py
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('about/', views.about, name='about'),
    # ...
]

接下来,在news应用程序中定义自己的URL模式

# news/urls.py
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('about/', views.about, name='about'),
    # ...
]

现在,我们可以在我们的主应用程序中使用include函数将这两个URL模式合并到一起

# myproject/urls.py
from django.urls import include, path

urlpatterns = [
    path('blog/', include('blog.urls')),
    path('news/', include('news.urls')),
]

在上述代码中,我们使用include函数将所有与blogs相关的URL映射到前缀为blog/的路径下,所有与news相关的URL映射到前缀为news/的路径下。这样,我们就可以通过输入相应URL路径来访问到它们了。

总之,include函数是建立复杂URL路由的重要工具,它允许我们创建高度模块化的应用程序,并将多个URL模式拼凑成一个完整的URL映射。

反向解析

  • 我们知道每个视图函数都有一个和其相对应的路由,但是如果它们之间的匹配关系发生了变化,那么与之对应的访问地址也需要跟着发生改变,这是极其不方便的。
  • 因此我们可以用一种动态解析 url 的方法来避免。我们使用 Path 语法提供的 name
    属性给对应路由起别名,从而让与之对应的链接或者跳转,会根据这个别名来动态解析 url,这个动态解析 url 路径的过程就是反向解析。
  • 在处理业务需求的过程中,当我们遇到重定向或在模板中需要链接到其他的视图函数,在这两种场景下我们就会使用到 url
    的反向解析,而不使用硬编码的方式将 url 放在模板中。这样做的优势在于当 URL 发生变化后,也无须我们更改模板中的 URL。

使用反向解析(reverse)创建URL能够带来以下好处:

  1. 代码可维护性更高: 当你需要修改某个URL时,只需要修改该URL所关联的name或者将其修改为另一个URL,而不需要在整个代码库中寻找和更新它的引用。这可以节省大量的时间并减少一些常见的错误。
  2. 支持重构: 在代码重构中,大部分无法自动更新的URL都与Django应用程序中的地址相关。使用反向解析,这些URL可以更安全容易地重命名、布局或重新分组。
  3. 更易于语义化和可读性:如果你在代码中使用具有描述性名称的命名URL模式,则你的代码将更容易理解并增加可读性。因此,你的代码更适合他人阅读并更具可维护性。

反向解析应用

在需要解析 URL 的地方,Django 提供了不同的方式来实现 URL 反向解析

  • 在模板层使用 {% url %} 模板标签;
  • 在视图函数的 Python 代码中:使用 reverse() 函数;

我们对前两种方法进行实例讲解。首先我们需要在 index/urls.py 路由文件中对 index 应用进行注册,使用如下方式来完成注册:

app_name='index'   #写在开始位置即可
使用url标签实现反向解析

在index/urls.py 的路由列表中给 test/ 添加相应的 name 参数,如下所示:

from django.urls import path
from index import views

app_name='index'
urlpatterns=[
	path('test/',views.index_html,name='detail_hello'),
]

然后在 templates/index 目录下新建 newtest.html 并编写如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href=" {% url 'index:detail_hello' %}">点击继续</a>
    <p>一起去酒吧嗨翻天。</p>
</body>
</html>

最后在 index\views.py 编写视图函数并配置相应路由映射,如下所示

#视图函数
def redict_url(request):
    return render(request,'index/newtest.html')

#路由映射
urlpatterns=[
    path('redict/',views.redict_url),
]

最终通过访问 http://127.0.0.1:8000/index/redict/ 可以实现反向解析页面跳转

reverse()函数实现反向解析

reverse() 函数是在视图函数中实现反向解析的一种方式,它通常与配合 HttpResponseRedirect(http 重定向) 一起使用。我们再结合上面的例子来讲解,那么它理解与使用起来就会非常的简单,首先我们 index/views.py 中定义一个视图函数,如下所示:

from django.http import HttpResponseRedirect
from django.urls import reverse

#reverse函数实现反向解析重定向到我们想要的有页面
def test_to_reverse(request):
    return HttpResponseRedirect(reverse('index:detail_hello'))

#在index/urls.py中为视图函数配置路由 
urlpatterns=[
    path('test/',views.index_html,name='detail_hello'), 
    path('reverse/',views.test_to_reverse)
]

注意:在分发式路由中使用 index:detail_hello 也就是“应用名:url 别名”,如果不是分发式路由可以直接使用 url 别名,即 reverse(‘detail_hello’)

最后访问 http://127.0.0.1:8000/index/reverse/ 可以直接重定向到 http://127.0.0.1:8000/index/test/。

reverse() 函数简析

上面我们使用 reverse 函数完成了视图函数的重定向,但是这里还要给大家简单介绍一下 reverse() 函数。在 Django中 reverse() 的定义如下所示:

reverse(viewname,urlconf=None,args=None,kwargs=None,current_app=None)

它只有一个必填参数,其他都是可选参数。其中 viewname 参数除了可以接受 url 路由 name 的别名以外,还可以接受可调用视图函数对象作为参数。示例如下:

from BookStore import views
def test_to_reverse(request):
    return HttpResponseRedirect(reverse(views.test_url))

其他参数说明如下:

  • urlconf:这个属性用于决定当前的反向解析使用哪个 URLconf 模块,默认是根 URLconf;
  • args:它用于传递参数,可以是元组或者列表,顺序填充 url 中的位置参数;
  • kwargs:字典类型的传参,和 args 作用一样;
  • current_app:它指定当前视图函数所在的 app,本例中是 index 应用。

命名空间namespace

我们知道一个 Django 项目中可以创建多个应用,每个应用又可以定义很多的视图函数,所以就会有很多的 url 路由映射(简称 url模式),在这种情况下给 url 命名就难免会发生命名冲突, Django 为了解决这一问题,为开发者提供了命名空间功能即namespace。url 命名空间使得即使在不同的应用(app)中定义了相同的 url 名称,也能够正确的实现 url 反向解析。

  • URL 命名空间分为两个部分:第一,应用命名空间即使用 app_name 关联应用名字;第二,使用 namespace
    用来标识一个应用的实例,主要功能是区分同一个应用中不同的实例。

下面为了让大家更好的理命名空间的概念,我们对本节的示例进行改写,首先在主路由 BookStore/urls.py 的 url 模式列表中,使用 namespace 参数给 index 应用添加命名空间。如下所示:

urlpatterns = [  
	path('index/',include('index.urls', namespace='books'))
]

在 index 应用的 urls.py 中添加(若之前已经添加则无需再重新添加)如下所示:

app_name="books"
  • 虽然在使用include()函数包含其他应用程序的URLconf时使用了"namespace=‘books’"参数来区分 URL 名称空间,但是为了使Django完全正确地处理 URL 命名空间,还需要在已经包含的应用程序的 URLconf 中设置
    “app_name” 变量,以指定该应用程序的命名空间名称。
  • 这主要是因为模板中的 reverse() 或 url() 函数可以使用命名空间来解析 URL。这也就是说,如果不设置 app_name
    变量,则这些函数可能无法正确解析 URL 并将引起反向完成错误。

经过上面的设置我们就完成了 index 应用的命名空间操作,这样即使是不同的应用存在相同 url 名称,Django 也能精准的解析我们想要的 url 路径。文章来源地址https://www.toymoban.com/news/detail-517665.html

到了这里,关于Django基础入门⑧:Django路由详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【 Python 全栈开发 - WEB开发篇 - 26 】Javascript 基础

    Javascript 是一种动态的、基于对象的编程语言,通常用于网页的客户端脚本编程。它可以在网页上实现交互效果、动态效果、表单验证、数据处理等功能。 学习 Javascript 可以通过以下途径: 在线教程:像 w3schools、MDN 等网站提供了详细的 Javascript 教程和示例代码。 书籍:可以

    2024年02月08日
    浏览(28)
  • 〖Web全栈开发①〗—网络编程基础(上)

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 📌 计算机网络 : 📜📜计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网

    2024年02月05日
    浏览(32)
  • 〖Web全栈开发②〗—网络编程基础(下)

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎯 学习目标 能够知道TCP客户端程序的开发流程 1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程

    2024年02月04日
    浏览(26)
  • Django基础入门⑥:Django过滤器和标签讲解

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django过滤器是

    2024年02月11日
    浏览(27)
  • Django基础入门⑨:Django路由Path方法

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 path()方法 pat

    2024年02月11日
    浏览(32)
  • Django基础入门⑬:Cookie和Session详讲和Django HTML表单实战讲解

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 📑📑 在 Dja

    2024年02月13日
    浏览(31)
  • 一周学会Django5 Python Web开发-Django5路由定义

    锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计22条视频,包括:2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~、第2讲 Django5安装、

    2024年02月19日
    浏览(32)
  • 【Web开发 | Django】数据库分流之道:探索Django多数据库路由最佳实践

    🤵‍♂️ 个人主页: @AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍 🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能硬件(虽然硬件还没开始玩,但一直

    2024年02月07日
    浏览(50)
  • django传统全栈开发一个ChatGPT应用

    根据客户需求,开发一个能多人使用的 ChatGPT 平台,背后使用的是 ChatGPT 的 api_key 。 需求 1、可多轮对话 2、可删除对话 3、流式显示对话 4、可多人使用 5、多个api_key均衡使用 技术分析 第一次接触 openai 的二次开发,看文档、看文章,技术点如下: 1、不同等级的 api_key 使用

    2024年02月08日
    浏览(38)
  • 4.Python从入门到精通—Python 基础语法详细讲解-下

    Python中的输入输出和文件操作是编程中非常常见和重要的部分。下面我会详细讲解Python中的输入输出和文件操作。 Python中的输入输出通常使用input()和print()函数。 输入 input()函数用于从控制台获取用户输入的数据。它的基本用法如下: 其中,prompt是可选的字符串参数,用于向

    2024年03月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包