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编程中@property装饰器的用法
Jun 20 Python
Python列表切片用法示例
Apr 19 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
pytorch: tensor类型的构建与相互转换实例
Jul 26 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
pandas 数据类型转换的实现
Dec 29 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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获取网页内容方法总结
2008/12/04 PHP
深入php多态的实现详解
2013/06/09 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
python选择排序算法的实现代码
2013/11/21 Python
python比较两个列表是否相等的方法
2015/07/28 Python
python构建深度神经网络(DNN)
2018/03/10 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
教师个人的自我评价分享
2014/01/02 职场文书
教师演讲稿范文
2014/01/08 职场文书
质量承诺书怎么写
2014/05/24 职场文书
人事专员岗位说明书
2014/07/29 职场文书
干部作风建设工作总结
2014/10/29 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
python 调用js的四种方式
2021/04/11 Python
Python安装使用Scrapy框架
2022/04/12 Python