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中的二维数组的操作方法
May 02 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
python中的set实现不重复的排序原理
Jan 24 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
便捷提取python导入包的属性方法
Oct 15 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python程序变成软件的实操方法
Jun 24 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
Django实现文件上传下载功能
Oct 06 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 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
一个数据采集类
2007/02/14 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
Python下线程之间的共享和释放示例
2015/05/04 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
晚会主持词开场白
2014/03/17 职场文书
小学体育组工作总结
2015/08/13 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS