Django框架视图层URL映射与反向解析实例分析


Posted in Python onJuly 29, 2019

本文实例讲述了Django框架视图层URL映射与反向解析。分享给大家供大家参考,具体如下:

Django视图层主要工作就是衔接HTTP请求、python程序、HTML模板。

URL分发(URL dispatcher)映射配置可以被看作Django项目的入口配置(项目下的urls.py以及应用的下的urls.py,include将两者联系起来在项目下的urls.py),通过URLdispatcher可以指定用户的每一个访问的后台的python处理函数是什么。

1.普通url映射

每一个Django都有一个urls.py来维护URL dispatcher,如下所示:

from django.conf.urls import url
from . import views #导入视图处理函数
urlpatterns = [
  url(r'^year/2015/$', views.moments_2015),
  url(r'^year/([0-9]{4}$)', views.years_moments),
  url(r'^month/([0-9]{4})/([0-9]{2}$)', views.month_moments),
  url(r'month/([0-9]{4})/([0-9]{2})/([0-9]+)$', views.test),
]

该文件通过维护urlpatterns列表的元素完成URL映射,每个元素都是django.conf.urls.url的一个实例,url的第一个参数是HTPP路径,第二个是相应的python函数名。

URL路径用正则表达式表达,'^'起始符,'$'结束符,第一个路径是严格路径,只匹配'year/2015',调用是的views中moment_2015(request)函数,request是用户请求对象!

第二个路径匹配的事任何'year/xxxx'路径,其中xxxx代表是四个数字,调用views的year_moment(request,xxxx),并且会把四个数字当成变量传给该函数

第三个第四个与第二个类似,只不过后续添加了更多路径变量调用函数分别为month_moments(request, xxxx, yy)和test(request,xxxx, yy, zz)

2.命名URL参数映射

命名URL参数映射使得开发者可以定义这些被传递参数的参数名称,方式为"?P<name>pattern",如下所示:

from django.conf.urls import url
from . import views
urlpatterns = [
  url(r'^year/2015/$', views.moments_2015),
  url(r'^year/?P<year>([0-9]{4}$)', views.years_moments),
  url(r'^month/?P<year>([0-9]{4})/?P<month>([0-9]{2}$)', views.month_moments),
]

当多个URL映射定义可以匹配同一个URL访问,django会选取列表的第一个元素!!!!!!!!!!

后两个url使用命名参数进行定义,调用函数如下:

year_moments(request,year=xxxx)和month_moments(request,year=xxxx,month=xx)!

3.分布式URL映射

在django项目中,可能包含多个应用,每个app都有自己urls.py,如果将所有的url映射都放在一个urls.py文件不利于维护。Django通过include()函数提供了分布式URL映射功能。

在项目根映射文件urls.py引用其他应用的映射文件:

from django.conf.urls import url, include
urlpatterns = [
  url(r'^moments/', include('djangosite.app.urls')),
  url(r'^admin/', include('djangosite.admin.urls')),
]

以moment/开头的URL被转接到djangosite.app.urls.py文件

以admin/开头的URL被转接到djangosite.admin.urls.py文件

其中子映射文件app/urls.py:

from django.conf.urls import url, include
from . import views
urlpatterns = [
  url(r'^year/?P<year>([0-9]{4})/$', views.year_moments),
  url(r'^admin/', include('djangosite.admin.urls')),
]

解析URL:

第一个对http://xxxxxxxxx/moments/year/2013的访问会定位到app/views.py的year_moments函数

第二个元素对http://xxxxxx/moments/admin的访问会转接到djangosite.admin.urls.py文件进行解析

4.反向解析

django的反向解析共那个在模板文件和python视图函数 :

在模板文件中用{%url%}标签调用反向解析;

在python视图函数中用django.urls.reverse()函数。

from django.conf.urls import url, include
urlpatterns = [
  url(r'^year/2015/$', views.year_moments, name="moments_2015"),
]

定义一个URL映射,通过name参数将该映射命名为moments_2015.在需要获取该URL的模板文件中{%url%}标签来进行声明:

<a href="{% url 'moments_2015'%}" rel="external nofollow" >
查看2015消息
</a>

上面用'moments_2015'映射名作为反向解析的参数,解析结果为:

<a href="/year/2015/" rel="external nofollow" rel="external nofollow" >
查看2015消息
</a>

在视图函数中调用方式是reverse函数。如下所示:

#views.py
from django.urls import reverse
from django.http import HTTPResponseRedirect
def redirect_to_year_2015(request):
  return HTTPResponseRedirect(reverse('moments_2015'))

5.反向解析带参数

模板文件如下所示:

from django.conf.urls import url, include
urlpatterns = [
  url(r'^year/?P<year>([0-9]{4})/$', views.year_moments, name="moments"),
]

模板文件通过{%url%}标签调用反向解析:

<a href="{% url 'moments', 2015%}" rel="external nofollow" >
查看2015消息
</a>

上面用'moments_2015'映射名作为反向解析的参数,解析结果为:

<a href="/year/2015/" rel="external nofollow" rel="external nofollow" >
查看2015消息
</a>

python视图函数调用reverse进行反向解析:

#views.py
from django.urls import reverse
from django.http import HTTPResponseRedirect
def redirect_to_year_2015(request):
  return HTTPResponseRedirect(reverse('moments', args=(2014,)))

args参数可以携带参数反向解析!

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
详解Golang 与python中的字符串反转
Jul 21 Python
神经网络python源码分享
Dec 15 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
python距离测量的方法
Mar 06 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
详解Python二维数组与三维数组切片的方法
Jul 18 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
python 破解加密zip文件的密码
Apr 22 Python
Django 重写用户模型的实现
Jul 29 #Python
python写程序统计词频的方法
Jul 29 #Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 #Python
PyQt5使用QTimer实现电子时钟
Jul 29 #Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 #Python
Python将string转换到float的实例方法
Jul 29 #Python
django foreignkey(外键)的实现
Jul 29 #Python
You might like
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
大学教师年终总结的自我评价
2013/10/29 职场文书
汽车专业毕业生推荐信
2013/11/12 职场文书
电气工程师岗位职责
2014/01/01 职场文书
高一新生军训感言
2014/03/02 职场文书
事业单位鉴定材料
2014/05/25 职场文书
网站推广策划方案
2014/06/04 职场文书
篮球比赛口号
2014/06/10 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
小学生毕业评语
2014/12/26 职场文书
工程合作意向书范本
2015/05/09 职场文书
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python