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中常用操作字符串的函数与方法总结
Feb 04 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python制作词云图代码实例
Sep 09 Python
将python安装信息加入注册表的示例
Nov 20 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 Python
python 将Excel转Word的示例
Mar 02 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
FCK调用方法..
2006/12/21 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
js中Generator函数的深入讲解
2019/04/07 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
Python 文件重命名工具代码
2009/07/26 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python with语句和过程抽取思想
2019/12/23 Python
python实现logistic分类算法代码
2020/02/28 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
应届毕业生通用的自荐书范文
2014/02/07 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
股权投资协议书
2016/03/23 职场文书
golang内置函数len的小技巧
2021/07/25 Golang
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫