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多线程(python多线程简明教程)
Jun 09 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
python实现稀疏矩阵示例代码
Jun 09 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python设计模式之代理模式简单示例
Jan 09 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
Django单元测试工具test client使用详解
Aug 02 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
python中pyplot基础图标函数整理
Nov 10 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 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.ini中文版(2)
2006/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
js精度溢出解决方案
2012/12/02 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
node.js require() 源码解读
2015/12/13 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Django实现简单的分页功能
2021/02/22 Python
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
公务员保密承诺书
2014/03/27 职场文书
招股说明书范本
2014/05/06 职场文书
需求分析说明书
2014/05/09 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
酒店温馨提示语
2015/07/14 职场文书
2015年中秋节主持词
2015/07/30 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers