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 列表排序方法reverse、sort、sorted详解
Jan 22 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
python pygame模块编写飞机大战
Nov 20 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
windows下python安装pip方法详解
Feb 10 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 Python
你需要掌握的20个Python常用技巧
Feb 28 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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解析RSS的方法
2015/03/05 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
Bootstrap开发实战之响应式轮播图
2016/06/02 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Python属性和内建属性实例解析
2020/01/14 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
班组长工作职责
2013/12/25 职场文书
工作的心得体会
2013/12/31 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
优秀党员先进材料
2014/12/18 职场文书
雷锋的故事观后感
2015/06/10 职场文书
交通处罚决定书
2015/06/24 职场文书
四年级数学教学反思
2016/02/16 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python