django学习-4.url动态传值
1.前言
我们在浏览器访问一个网页A是通过一个指定的url地址去访问的。但在浏览器用一个不存在的url地址去执行访问是打不开正确的网页的,只会打开一个浏览器自带的有错误提示的网页。
在django框架,管理url配置的唯一一个py文件是【urls.py】。
我们按照一个实际的项目来说明,比如在django项目【helloworld】里,管理url配置的唯一一个【urls.py】所在的绝对路径是【helloworld/helloworld/urls.py】。用比较接地气的话来描述,就是所有用户从浏览器发送的任何一个访问django项目【helloworld】的urlB都会在【helloworld/helloworld/urls.py】这个urls.py里进行url规则匹配:如果urlB有先符合哪个匹配规则的,就执行后续流程(后续流程不具体展开描述);如果urlB都没符合哪个匹配规则的,就执行相关抛出错误的操作从而达到闭环(相关抛出错误的操作不具体展开描述);
举个例子W:假如一个存储商品的商品数据表good有2000条商品数据,这2000条商品数据要在一个页面C全部展示时,按照实际开发经验肯定要有翻页功能来进行数据展示的情况,所以翻页控件的页数是不固定的。假如页数对应的入参名为page,那么传递给后端接口的入参page值就是不固定的,比如:page=1,或者page=20;
所以,结合例子W来提出一个问题:当一个url路径里面带参数时候如何去处理呢?
2.urls.py配置规则
由于目前django版本比较多,在查资料时候,也会看到不同的版本用不同写法,对于我们初学者来说是比较迷惑的。
总结了下,我们只需要了解这三个函数即可:path、re_path、url,接下来具体分析下这三个有什么区别。
- path 只能绝对匹配路径地址,不支持正则匹配。(该函数,目前很少有开发人员使用)
- re_path 支持正则匹配。(该函数,只在django1.x版本常用,django2.x版本和更高版本基本很少使用)
- url 支持正则匹配。(实际上该url函数的返回值是返回re_path函数的返回值。)(该函数,django2.x版本和更高版本基本都会使用,强烈推荐统一使用该函数)
所以,后续我们统一使用url函数!另外两个函数只需要大概了解一下即可!
from django.urls import re_path,path
from hello import views urlpatterns = [
path("index/",views.index),
re_path("^$",views.zhuye),
url("^demo/$",views.demo),
]
在浏览器上分别访问:http://127.0.0.1:8000/index/, http://127.0.0.1:8000/, http://127.0.0.1:8000/demo/ ,发现都能正确访问到对应内容。
打开函数path和函数re_path源码,就能看到函数path的匹配规则是RoutePattern(绝对匹配),函数re_path的匹配规则是RegexPattern(正则匹配)。
注意事项:
比如我们在浏览器上输入一个地址【http://127.0.0.1:8000/demo】后点击发送请求,地址会变为【http://127.0.0.1:8000/demo/】,也就是说会在【demo】后面自动加上一个【/】。
比如我们在浏览器上输入一个地址【http://127.0.0.1:8000/】后点击发送请求,地址会变为【http://127.0.0.1:8000】,也就是说会在【8000】后面自动删掉一个【/】。
所以,不管是使用url函数,还是使用path函数,还是使用re_path函数,匹配路径统一在后面要加个【/】,但是匹配路径前面不需要加【/】(因为django框架会自动添加),比如:【index/】 、【demo/】、【demo/page/】。
比如在本地django项目【helloworld】有个【url("^demo/$",views.demo)】,那么django框架会获取到项目【helloworld】启用服务后的当前基本路径信息【http协议或者https协议://IP地址:开启服务的端口号/】比如为【http://127.0.0.1:8000/】,结合【url("^demo/$",views.demo)】,就能得到一个url的绝对访问地址【http://127.0.0.1:8000/demo/】。任一个用户在浏览器上只能输入【http://127.0.0.1:8000/demo/】才能访问并查看到demo函数所返回的demo.html页面内容。
举个反例:比如在本地django项目【helloworld】有个【url("^demo$",views.demo)】,但任一个用户在浏览器上输入【http://127.0.0.1:8000/demo/】,看用户会看到什么页面内容?
3.urls是部分动态
3.1.当访问的页面展示的数据较少且没有分页的情况,只有1页的时候,对应的页数就能写死,对应的url配置规则可以写成这样【url("^demo/page=1$",views.demo)】。
3.2.1.当访问的页面展示的数据较多且有分页的情况,对应的页数就不能写死,对应的url配置规则就不能继续写成这样【url("^demo/page=1$",views.demo)】,否则用户想访问第二页的数据时django框架会返回给用户一个错误的提示页面。
3.2.2.所以如果想匹配任意的页面,对应的url配置规则可以写成这样【url("^demo/page=\d+$",views.demo)】(匹配任意数字,可以用正则【\d+】)。
比如我要访问第二页的数据,是能成功访问的:
3.2.3.通过3.2.2的配置,我们可以在浏览器上输入任意page页数访问到同一个视图函数【demo】,但这依然不是我们想要的结果。我们希望传不同的page页数,能访问到不同的网页内容!所以我们接下来就是要写一个新的视图函数【page】!
第一步:我们在【helloworld/hello/views.py】里写带一个参数【random_num】的视图函数【page】,并且加个异常校验【当输入的page页数值不是数字,就抛个异常404页面】。
第二步:接着,我们在【helloworld/helloworld/urls.py】写上一个对应的url匹配规则。
url的简单使用可以先参考该网址:https://blog.csdn.net/weixin_45414731/article/details/99751732。
url的详细使用可以查看django官方网址:https://docs.djangoproject.com/en/3.1/topics/http/urls/。
第三步:接着,我们在浏览器上输入对应的page值为正整数,都能正确给用户展示不同的页面结果!
比如输入:【http://127.0.0.1:8000/demo/page=3】、【http://127.0.0.1:8000/demo/page=7】。
第四步:接着,我们在浏览器上输入对应的page值为非数字,都只会给用户返回一个错误的报错页面。
比如输入:【http://127.0.0.1:8000/demo/page=我】。
看到这样的报错页面,是因为django项目【helloworld】的【helloworld/helloworld/setting.py】里有个常量DEBU值为True。如果将常量DEBUG的值改为False,并且重启django项目【helloworld】的服务后,重新在浏览器用这个地址【http://127.0.0.1:8000/demo/page=我】进行访问,都只会给用户返回一个标准的404页面。
注意点:由于处于开发阶段,DEBUG 默认为True。当产品开发完成且产品正式发布上线时,需要将DEBUG = False,这样用户访问到的错误页面就都会是标准的404页面。
4.常量【ALLOWED_HOSTS】的简单使用
在django项目【helloworld】,常量【ALLOWED_HOSTS】是只存储在【helloworld/helloworld/setting.py】里。
常量【ALLOWED_HOSTS】的数据类型是list。默认值为空list,表示只允许本地的localhost或本地的127.0.0.1在浏览器上访问该django项目【helloworld】。
如果想让所有的域名都能访问django项目【helloworld】,可以设置为:ALLOWED_HOSTS = ["*"] 。
5.其他相关知识点的记录(想到了就记录)
5.1. 元字符【.】的使用场景。
django学习-4.url动态传值的更多相关文章
- Django学习---路由url,视图,模板,orm操作
Django请求周期 url -> 路由系统 ->函数或者类 -> 返回字符串 或者 模板语言 Form表单提交: 点击提交 -> 进入url系统 -> 执行函数 ...
- Django学习手册 - 正则URL路由配置/路由分发
############################################### 总结: 一.url路由配置: 方式一:(通过url链接get获取) 方式二:(url路由匹配方式获取-拓 ...
- django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能
1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...
- Django学习(四) Django提供的后台管理系统以及如何定义URL路由
一旦你建立了模型Models,那么Django就可以为你创建一个专业的,可以提供给生成用的后台管理站点.这个站点可以提供给有权限的人进行已有模型Models数据的增删改查. 将新建的模型Models是 ...
- Django 2.0 学习(02):Django视图和URL(上)
接上篇博文,接下来我们以具体代码例子来说明Django的基本流程. 创建项目 使用Win+R,输入cmd进图windows命令行模式: 再你想要存放项目工作的磁盘,输入下面命令: django-adm ...
- Django学习手册 - reverse()反转URL
前端: <h1>测试</h1> <a href="/ce_test/?id=1">1按键</a> <a href=" ...
- Django学习:url路由系统
一.MTV模型 1.Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量( ...
- Django( 学习第三部 Django的url路由层)
目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...
- Django学习笔记(2)——模型,后台管理和视图的学习
一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...
随机推荐
- Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警
Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...
- Fastjson使用实例
Fastjson使用实例 一.FastJson使用范例 1.1FastJson三个核心类 1.2Maven依赖 1.3Scala API 1.3.1反序列化 1.3.2序列化 1.4Java API ...
- 【从零开始撸一个App】RecyclerView的使用
目标 前段时间打造了一款简单易用功能全面的图片上传组件,现在就来将上传的图片以图片集的形式展现到App上.出于用户体验考虑,加载新图片采用[无限]滚动模式,Android平台上我们优选Recycler ...
- 设计模式(十四)——模板模式(SpringIOC源码分析)
1 豆浆制作问题 编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3 ...
- Python3.9.1中如何使用split()方法?
本文出自:lunvey,半路出家学编程之Python.split()方法定义于str类中,str类大家都知道是python内置定义的一个字符串类. split()默认两个参数,分别是分隔符和分隔数量, ...
- E - Period(KMP中next数组的运用)
一个带有 n 个字符的字符串 s ,要求找出 s 的前缀中具有循环结构的字符子串,也就是要输出具有循环结构的前缀的最后一个数下标与其对应最大循环次数.(次数要求至少为2) For each prefi ...
- 牛客练习赛53 E-老瞎眼pk小鲜肉(思维+线段树+离线)
前言 听说是线段树离线查询?? 做题做着做着慢慢对离线操作有点感觉了,不过也还没参透,等再做些题目再来讨论离线.在线操作. 这题赛后看代码发现有人用的树状数组,$tql$.当然能用树状数组写的线段树也 ...
- 2019牛客暑期多校训练营(第二场)A Eddy Walker(打表求概率)
题意:给你n,m分别表示 长度为n的环 和最后走到的位置m 问从0点出发每次都能能往前或者往后走 求最后在m点的概率思路:我们可以先打表模拟一下 发现好像每个点的概率大概都是1/(n-1) 打表代码: ...
- poj 1511-- Invitation Cards (dijkstra+优先队列)
刚开始想复杂了,一直做不出来,,,其实就是两遍dijkstra+优先队列(其实就是板子题,只要能有个好的板子,剩下的都不是事),做出来感觉好简单...... 题意:有n个车站和n个志愿者,早上每个志愿 ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (DP)
题意:给你一个长度为\(n\)的序列,求一个最长的\({x,x+1,x+2,.....,x+k-1}\)的序列,输出它的长度以及每个数在原序列的位置. 题解:因为这题有个限定条件,最长序列是公差为\( ...