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中装饰器的用法
Jun 28 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
Python学习之os模块及用法
Jun 03 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
python 进程池pool使用详解
Oct 15 Python
详解在OpenCV中如何使用图像像素
Mar 03 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中mysql模块部分功能的简单封装
2011/09/30 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
全面理解闭包机制
2016/07/11 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
python遍历目录的方法小结
2016/04/28 Python
python实现多线程抓取知乎用户
2016/12/12 Python
Python3实现转换Image图片格式
2018/06/21 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
安全责任书怎么写
2014/07/28 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
中英文求职信范文
2015/03/19 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
商业计划书之服装
2019/09/09 职场文书