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的Django框架部署的一些建议
Apr 09 Python
Python制作钉钉加密/解密工具
Dec 07 Python
Python实现求一个集合所有子集的示例
May 04 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 Python
python3.6实现学生信息管理系统
Feb 21 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python实现126邮箱发送邮件
May 20 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 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
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
js实现上下左右键盘控制div移动
2020/01/16 Javascript
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
python 编程之twisted详解及简单实例
2017/01/28 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
pandas值替换方法
2018/07/10 Python
python 文件查找及内容匹配方法
2018/10/25 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
总经理司机岗位职责
2014/02/06 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
祝寿主持词
2015/07/02 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
Minikube搭建Kubernetes集群
2022/03/31 Servers
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL