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模块学习 datetime介绍
Aug 27 Python
python实现端口转发器的方法
Mar 13 Python
进一步探究Python的装饰器的运用
May 05 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
python对文件的操作方法汇总
Feb 28 Python
python 子类调用父类的构造函数实例
Mar 12 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 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判断用户是否手机访问代码
2015/06/08 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
python psutil监控进程实例
2019/12/17 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python修改DBF文件指定列
2020/12/19 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
员工薪酬福利制度
2014/01/17 职场文书
对标管理实施方案
2014/03/12 职场文书
绿色学校实施方案
2014/03/31 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
工厂见习报告范文
2014/10/31 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
《家》读后感:万惜拯救,冷暖自知
2019/09/25 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers