django之五--获取url参数和name的作用

一、前言

假如我们要打开这两个博客园地址:【https://blog.csdn.net/LYX_WIN/article/month/2018/07】、【https://blog.csdn.net/LYX_WIN/article/month/2018/12】,会发现这两个地址的最大差别就是时间参数的值是动态的(年和月的值是动态的)。

那么,如果我们想要获取地址【https://blog.csdn.net/LYX_WIN/article/month/2018/07】里面的【2018】和【07】这两个值,就涉及到url参数值的获取了! 

二、获取url里的参数和对应参数值

结合我们本地diango项目【helloworld】,比如我们想要获取地址【http://127.0.0.1:8000/article/month/2018/07】里面的【2020】和【10】这两个值。

那么:

1、第一步:在【helloworld/hello/views.py】新增一个视图函数【home】,具体数据如图所示。

2、第二步:在【helloworld/helloworld/urls.py】新增一个path匹配规则,具体数据如图所示。

3、第三步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/article/month/2018/07】,会得到正确的页面内容。

三、url函数的正则匹配规则

通过【二、获取url里的参数和对应参数值】的案例,我们可以实现从一个url地址上获取到我们想要的参数year和参数month的值!

但是我们也会遇到一个问题:年和月的值可以输入任意数据类型的数据,如:【http://127.0.0.1:8000/article/month/2021我w/520你n】,这样得到的参数值显然不符合实际场景的要求!

所以,我们如果想让参数year的值只能是4个数字,month参数的值只能是2个数字,该怎么做呢?这个时候,path函数就不满足我们的使用要求了,我们需要用url函数并用url函数的正则匹配功能来实现!

url函数的正则匹配规则常用的匹配规则有这些:

  • ?P<一个唯一的参数名>    ->作用:定义一个参数。(参数的命名要跟python语法的命名规则一样)
  • [0-9]                                  ->作用:匹配0到9范围内的任何一个数字。
  • {4}                                     ->作用:匹配长度为4的4个数字。
  • {1,2}                                  ->作用:匹配长度为1的1个数字,或者匹配长度为2的2个数字。
  • r                                        ->作用:raw原型。(r只跟一个字符串配合使用:r+一个字符串A。像这样【r"/n_xiaolei_\n”】,就表示字符串【"/n_xiaohong_\n"】里的任何一个数据都不转义都保持原始作用,打印出来的值仍然是【"/n_xiaolei_\n"】。)
  • ^                                       ->作用:匹配开始。(一定是从【http协议或https协议//:IP:端口号/剩余的路径】的【http协议或https协议//:IP:端口号/】的【端口号/】里的【/】的右边第一个字符开始进行匹配。因为django框架会自动拿【http协议或https协议//:IP:端口号/】去跟【剩余的路径】进行拼接得到一个唯一的url的绝对路径。)
  • $                                       ->作用:匹配结束。(一定是从【http协议或https协议//:IP:端口号/剩余的路径】的【剩余的路径】里的最后一个字符的右边结束匹配。)

1、第一步:在【helloworld/hello/views.py】新增一个视图函数【home1】,具体数据如图所示。

2、第二步:在【helloworld/helloworld/urls.py】新增一个url匹配规则,具体数据如图所示。

3、第三步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/article1/month/2018/09】,会得到正确的页面内容。

 值得注意的一个细节:如果参数month的值为一个任意数据,比如访问该地址【http://127.0.0.1:8000/article1/month/2018/11】,也会得到正确的页面内容。

4、容易引起程序报错的场景:要注意url匹配规则里的参数名和对应视图函数里的参数名要每个都保持一致,不然脚本被调用后的执行过程中会报错导致程序中断。

 举个实际反例:假如我现在把url匹配规则里的【year】改成【years】后,重新热启动django项目【helloworld】服务后,重新访问该地址【http://127.0.0.1:8000/article1/month/2018/11】,会返回给我这个报错页面!

四、url函数中给参数name赋值的作用

首先,我们先提出一个问题:

假如我们的本地django项目【helloworld】已经有一个home.html,还有一个demo.html。之前这两个页面是独立的互不相关的,但现在我们要在home.html页面新增一个按钮A,当我们点击按钮A能跳转到demo.html的这个功能该如何实现呢?

1、第一步:在【helloworld/hello/templates/】里新增一个【home.html】,具体数据如图所示。

代码:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>厦门-小雷</title>

    <base href="http://127.0.0.1:8000/" target="_blank">

</head>

<body>



<p>

    欢迎来到django!

    <br>

    <br>

    <a href="demo/">点击我这个按钮,可以跳转到demo页</a>

</p>



</body>

</html>

2、第二步:在【helloworld/hello/templates/】里已存在的【demo.html】的内容保持不变,具体数据如图所示。

3、第三步:在【helloworld/hello/views.py/】里新增两个视图函数:【demo2】、【home2】,具体数据如图所示。

4、第四步:在【helloworld/helloworld/urls.py/】里新增两个url匹配规则,具体数据如图所示。

5、第五步:重新热启动django项目【helloworld】服务后,访问该地址【http://127.0.0.1:8000/home2/】,会得到正确的页面内容。

base元素的html知识点可以参考这个菜鸟教程地址:https://www.runoob.com/tags/tag-base.html。

6、改成用url函数里的参数name的值来维护url地址。

如果在【helloworld/hello/templates/home.html】这个页面里面把元素a的属性href的值所对应的一个url的相对路径地址写死了,比如目前是写成【<a href="demo/">点击我这个按钮,可以跳转到demo页</a>】,这样的做法会有个弊端,那就是:当多个html页面比如30个不同的html页面代码里都用到这个地址【"demo/"】时候,如果后续这个地址【"demo/"】变成了【"demo666/"】,那就很难维护了,这时需要开发人员手动一个一个去修改数据,把这30个html页面里的地址【"demo/"】都改为地址【"demo6/"】。

 所以,为了更好地维护每个html页面的元素a的属性href的值对应的url地址,我们可以在对应的url函数里的参数name赋值一个唯一的name值(name值可以理解为一个人的身份证号码)。

6.1、第一步:在【helloworld/helloworld/urls.py】里,自己需要给url函数里的参数name赋值的url函数进行赋值,具体数据如图所示。

6.2、第二步:在【helloworld/hello/templates/home.html】里,修改元素a的属性href的值对应的url地址:把旧数据【demo/】改为【{% url 'demo_page' %}】,具体数据如图所示。

6.3、第三步:重新访问该地址【http://127.0.0.1:8000/home2/】后在当前展示页面里点击按钮【点击我这个按钮,可以跳转到demo页】,会得到正确的页面内容。

6.4、容易引起程序报错的场景:当输入一个不存在的url地址,我们会访问到一个错误页面。比如访问该地址【http://127.0.0.1:8000/demo666/】,会得到错误的页面内容。

6.5、url函数里的参数name的值,按照实际开发规范,请确保参数name值的唯一性!

虽然参数name的值,在django框架里允许重复,但最好不要重复,不然会导致相关隐藏的错误(给用户配置的跳转页面地址可能会给错!)。

现在,我们可以结合实际代码,来进行分析!

从第一步倒第五步,可以得出简单的结论:

参数name有多个同样值的url函数,哪个url函数是放在文件最后执行的,那么这个url函数就是最终被调用执行的

猜你喜欢

转载自blog.csdn.net/LYX_WIN/article/details/114114712
今日推荐