Django定义路由_子路由_函数视图

news/2024/5/18 23:43:40/文章来源:https://blog.csdn.net/weixin_43865008/article/details/127205343

Django定义路由

      • 什么是路由,怎么去定义路由?
      • 添加路由
      • Path 函数
      • 路由定义的痛点
      • 处理路由中的动态参数

什么是路由,怎么去定义路由?

通常在我们创建项目包中,有个url.py的文件,我们需要去定义路由信息,所谓的路由信息,就是我们前端和用户在访问的时候,于我们后端视图之间的一一映射关系,我们叫做路由。

添加路由

需要在全局路由文件中(url.py),urlpatterns 列表中添加路由条目

在这里插入图片描述

urlpatterns 列表的底层逻辑为 路由会从上到下进行匹配,称为 “路由寻址” , 如上面代码所示,我们定义了一个 urlpatterns 列表, 此时我们有一个 “get_project/” 的路由地址,程序会先在 urlpatterns 去匹配
'index/' ,发现'index/'“get_project/” 未匹配上,此时会向下向下匹配,知道匹配到 “get_project/”,匹配成功之后则在前端页面展示。

urlpatterns 条目中一单匹配成功, 就会终止往下匹配,如果期间全部匹配完,仍然没有匹配到地址,则页面 404。

    from django.urls import pathfrom project.views import index, get_projecturlpatterns = [# path('admin/', admin.site.urls),path('index/', index),path('get_project/', get_project),]

Path 函数

  • Path函数 用于定义路由条目

  • 第一个 参数为 url 路径参数(字符串),路径最前面不能添加 /, 路径最后面需要添加 /,如图 “get_project/”

  • 第二个 参数为 视图函数 或者 类视图,如果添加视图函数无需()调用

     错误实例: path('index/', index()),正确实例: path('index/', index),
    
  • 如果 第二个参数为 include,那么会继续到子路由中匹配,子路由的匹配规则于全局路由匹配规则一致

  • path 的第一个参数可以使用类型转换器 <类型转换器:参数名称>, 如: <int:name>

     默认类型转换器: int、str、slug、uuid,参数名称,在调用视图时,会自动传递给视图函数,需要使用同名的参数去接收它
    

添加路由实战

首先,我们在 子应用的 view.py 中创建最简单一个视图
在这里插入图片描述

def index(request):return HttpResponse("欢迎测试开发")

创建好视图之后,此时我们创建一个路由,让后端视图 和 url 映射。因此我们需要在 url.py中的 urlpatterns 中添加路由。

首先,我们需要导入后端视图, from project.views import index,这个和我们在 python 导包类似,导入之后使用 path() 函数定义路由条目

在这里插入图片描述

from django.urls import path
from project.views import index, get_projecturlpatterns = [# path('admin/', admin.site.urls),path('index/', index),path('get_project/', get_project),]

重新启动 django 服务,访问 index/ 路由,我们可以看到这个页面,说明我们程序成功了。

在这里插入图片描述

路由定义的痛点

按照上方我们定义路由的场景,正常情况下程序运行是没有什么问题的,但是我们思考一下,假设我们此时需要开发一个大型项目,那么我们可能会定义成千上万的路由,那么这种情况下,我们按照上方的路由定义规则,显然不合理,那么针对这种场景,我们应该怎么处理呢?

在子应用中创建 urls.py

当我们项目特别庞大时,会有多个模块,因为我们可以在不同的子应用中,定义单独的 urls 路由 。

      
from django.urls import path
from project.views import get_project, create_project, delete_project, put_project# 假设我们分别定义了四个视图  get_project, create_project, delete_project, put_project
urlpatterns = [path('get_project/', get_project),path('put_project/', put_project),path('create_project/', create_project),path('delete_project/', delete_project),

在这里插入图片描述

  • 我们添加了子理由之后,此时我们到主路由下,添加子路由,使用 include()方法
  • include() 中 project.urls ,project为我们的子子引用名称,urls为子应用的中 urls.py文件,这里和python中的导包类似
  • include() 会进入到子路由中匹配,子路由的匹配规则和主路由规则一致
urlpatterns = [path('project/', include("project.urls")),]

在这里插入图片描述
按照上方的逻辑,我们在 django 框架中定义了一个子路由,但是这里我们思考一下,假设主路由和子路由中有相同的路由,程序中是如何处理的?

假设主路由中,我们有个路由为 'index/',子路由中,我们同样配置了 'index/',但是两个路由配置了不同的视图 此时程序会先去主路由中查找,如果在主路由中找到了,则会跳转到主路由对应的视图 如果主路由没有找到,才会进入到子路由。

处理路由中的动态参数

首先,我们定义一个可以接收参数的视图,其中函数中的 pk 为我们可接收的动态参数。

def get_projects(request, pk):return HttpResponse(f"获取项目信息:{pk}")

然后我们此时在 urls 路由中配置路由,添加路径参数 int:xxx, 参数值必须要是int类型

# 注意,我们这里 <int:pk> 接收的是 pk这个参数,并且为int类型
# 那么视图函数,我们接收的参数名称也需要是 pk
urlpatterns = [path('projects/<int:pk>/', get_projects),
]

重新项目之后,我们再来访问路由
在这里插入图片描述
当然,django提供了非常完善的功能,目前我们的参数内容都是完整的,django 也支持正则匹配。

# 我们需要导入 re_path
from django.urls import re_path# repath中我们需要填写正则内容,注意点:1)首先第一个我们必须要使用 r 开头,后方填写正则字符串信息2)正则表达式中,必须要在 以 ^ 开头, $ 结尾
urlpatterns = [re_path(r'^projects/(?P<pk>\w{3})/$', get_projects)
]

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树专项训练LeetCode

144. 二叉树的前序遍历 二叉树入门 递归 与 迭代 class Solution {List<Integer> ans new ArrayList<>();void dfs(TreeNode root){if(root null) {return;}ans.add(root.val);dfs(root.left);dfs(root.right);}public List<Integer> preorderTraversal(T…

【Golang开发面经】蔚来(两轮技术面)

文章目录一面1. channel 缓冲与非缓冲2. mysql引擎3. 索引如何建立&#xff1f;4. linux 如何看进程5. redis 字符串的底层6. 线程池理解7. 线程池的拒绝策略8.悲观锁&#xff0c;乐观锁9. HTTP 各个版本的区别10. HTTP2.0之前怎么实现服务器推送机制&#xff1f;11. websocket…

[操作系统] 启动

启动 一、通电 由于内存是随机存储器&#xff08;Random access memory&#xff0c;RAM&#xff09;&#xff0c;属于易失性存储器&#xff0c;未通电时&#xff0c;RAM中不会有任何内容&#xff0c;因此刚一通电&#xff0c;RAM不可能有任何实际信息。计算机硬件厂商在只读存…

信创浪潮下,看看大公司是如何建立数据安全保护体系的?

信创&#xff0c;即信息技术应用创新产业&#xff0c;它是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。信创涉及到的行业包括IT基础设施&#xff1a;CPU芯片、服务器、存储、交换机、路由器、各种云和相关服务内容&#xff0c;基础软件&#xff1a;数据库、…

1.ROS机器视觉:单目摄像头的调用与标定

(1条消息) ROS改错&#xff1a;vm虚拟机中调用摄像头失败_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127204106?spm1001.2014.3001.5502 首先保证摄像头是可调用的。 1.安装usb_cam驱动 sudo apt-get install ros-melodic-usb-…

数据导入导出功能的测试点

【数据导入功能】 一、操作按钮校验 1、导入按钮生效 2、取消导入按钮生效 二、导入模板校验 1、文件数量 1&#xff09;不传模板&#xff1a;点确认时提示错误 2&#xff09;传模板&#xff1a;只支持单文件 or 还支持多文件同时导入 2、文件格式 只支持xlsx文件 or 还支…

HTML学生个人网站作业设计 学生大学生活网页设计作品 学生个人网页模板 简单个人主页成品 div+css个人网页制作

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

Java项目:ssh网上便利店系统

作者主页&#xff1a;夜未央5788 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目分为前后台。非maven项目&#xff1b; 前台主要功能包括&#xff1a; 会员登录、注册、商品展示、加入购物车、会员中心、我的订单、我的地址…

【跟学C++】C++队列——queue类(Study13)

文章目录1、队列2、队列--queue类的使用2.1 实例化queue2.2 queue的成员函数3、优先级队列--priority_queue类的使用3.1 实例化priority_queue3.1 priority_queued的成员函数4、总结 【说明】 大家好&#xff0c;本专栏主要是跟学C内容&#xff0c;自己学习了这位博主【 AI菌】…

多测师肖sir_高级讲师_第2个月第21讲解jmeter安装

一、安装流程&#xff1a; 1、安装jdk &#xff08;linux&#xff0c;windows上&#xff09;&#xff0c;jdk编译java语言&#xff0c; 2、jdk环境配置&#xff0c;dos中java -version 查看jdk版本 3、下载jmeter包&#xff0c;解压&#xff0c;bin 目录 &#xff0c;jmeter.ba…

从零开始配置vim(25)——关于 c++ python 的配置

从9月份到国庆这段时间,因为得了女儿,于是回老家帮忙料理家事以及陪伴老婆和女儿。一时之间无暇顾及该系列教程的更新。等我回来的时候发现很多小伙伴私信我催更。在这里向支持本人这一拙劣教程的各位小伙伴表示真诚的感谢。言归正传,让我们开始吧 之前我们根据lua语言配置了…

(附源码)计算机毕业设计ssm电子购物商城

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【DL】第 11 章:自动驾驶汽车的深度学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

《uni-app》一个非canvas的飞机对战小游戏-启动页

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e;接下来的几篇都是uni-app的小实战&#xff0c;有助于我们更好的去学习u…

基于微信小程序的校园失物招领寻物启事系统 java uniapp 小程序

随着信息化时代的到来,管理系统都趋向于智能化、系统化,微信小程序校园失物招领也不例外,但目前国内的市场仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而微信小程序校园失物招领能很好地解决这一问题,轻松应对校园失物招领平…

老项目vue2.x误用了vue3的插件问题

老项目vue2.x误用了vue3的插件问题背景插件vue-template-compilervue-loader问题回溯总结背景 vue3出来两年多了&#xff0c;它刚出来的时候&#xff0c;vue3相比vue2似乎并没有想像中那样受大家欢迎。因为两个版本的构架上相差太大了&#xff0c;许多的API都不兼容&#xff0…

洛谷题单 Part 2.4 分治

分治 即分而治之 将大问题化解为小问题逐一求解 这种题没有固定的模板 只有分治的思想 所以在做题的时候应当多想如何将一个大问题化解成若干个子问题进行求解 直接上题了 P1226 【模板】快速幂||取余运算 非常经典的分治问题 常规算法求aba^bab要O(b)O(b)O(b)的时间复杂度 我…

Mybatis常见查询总结,仅限于初级程序员阅读

情况描述&#xff1a; 本人初次接触Mybatis&#xff0c;然后对于其中的一些基础查询做一些简单总结&#xff0c;一次用来记录他的用法&#xff0c;便于以后查漏补缺。 1、Mybatis中查询特定的列:&#xff08;单列&#xff09; 如果查询指定列为Long类型&#xff0c;那么在re…

游戏合作伙伴专题:BreederDAO 与 Affyn一起重构现实生活

BreederDAO 团队很宣布与 Affyn 建立了新的合作关系&#xff0c;Affyn 是一家位于新加坡的公司&#xff0c;开发了基于地理位置的增强现实移动游戏。 移动元宇宙 Affyn 团队由来自 EA、任天堂、迪士尼和星巴克等顶级游戏、娱乐和生活方式公司的资深员工组成。他们洞悉了目前边玩…

html5网页设计作业代码 大学生校园网站制作 学校官网制作html

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…