位置: 编程技术 - 正文

Python探索之URL Dispatcher实例详解(python urllib urlopen)

编辑:rootadmin

推荐整理分享Python探索之URL Dispatcher实例详解(python urllib urlopen),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python2.7 urllib,python中urllib,python中urllib,python urlcode,python urljoin,python urljoin,python2.7 urllib,python2.7 urllib,内容如对您有帮助,希望把文章链接给更多的朋友!

URL dispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中。

有了这个base,我们先抛出几个问题,提前思考一下:

这个映射定义在哪里?当映射很多时,如果有效的组织?

URL中的参数怎么获取,怎么传给view方法?

如何在view或者是template中反解出URL?

好,先来看一个简单的例子:

这段代码就是一个URL Dispatcher的例子,它在一个单独的python模块定义,Django中管这个模块叫做URLconf,其实,就是通过python代码方式实现的配置文件,在这个配置中定义了URL路径和对应的处理方法之间的映射。在Django中,是通过“树”的结构来管理URLconf之间的关系的,在Django中的主配置文件中,有一个叫做ROOT_URL_CONF的配置项,就是用来指定根URLconf,从根URLconf开始,逐条进行匹配,直到找到匹配项为止,这就是我们上面提到的第一个问题的答案,下面还会再仔细剖析。

在上面例子中,我们可以看到有3个方法:patterns, url, include。url方法构建了一个URL到View方法的映射关系对象,patterns将这些映射关系对象组织成为一个python的列表,那include是做什么的呢?它就是我们上面说到的“树”结构关系的联系者,include会关联其他的URLconf到本URLconf,也就是说include关联的是孩子节点。整个URL dispatcher体系,就是由这三个方法构建起来的,下面我们重点来介绍这三个方法,了解了这三个方法,整个URL映射机制就会非常清楚了。

url()

先来看下最重要的url()方法。第一个参数regex是代表URL的正则表达式,第二个参数指定了和该正则表达式映射的View,此外,还可以通过kwargs参数,给view方法指定默认的kwargs参数,还有name参数,用来命名该URL,主要用在URL反解中,至于prefix用处不大,不解释。

url()方法最终构造了一个对象,我们姑且叫它URL映射对象,当第一次访问这个对象去匹配URL时,它会把这个对象中的正则表达式编译一次,然后保存在该对象中,所以以后再次匹配时,就会很快,不会重复编译该正则表达式了。在这里正则匹配其实就是用就是python的re模块,使用过程大致如下:

注意,这里涉及到了上面提到的第二个问题,即URL中的参数是如何获取,如何传递给view方法的。从URL中获取参数,其实是通过re模块中named groups和non-named groups的概念来获取的,通过match.groupdict()得到的是named groups,其实就是一个字典,字典的key是在URL中指定的,该字典会作为kwargs参数传递给view,而通过match.groups()得到的是non-named groups,是一个元组,即tuple,该元组会作为args参数传递给view。不过,这里的args和kwargs是不能够同时存在的,当有kwargs不为空时,args就会被置空,当kwargs为空时,args才会被用到,而传递给view的kwargs就只有url()方法中指定的默认kwargs。也就是说,如果你在URL中使用了named groups,那么non-named groups就会被忽略,如果只使用了non-named groups,它才会被作为args参数,传递给view方法。

好,纠结了一大堆,还是来解析一下我们上面提到的例子,假如我们有url和view:

urls:

views:

当我们访问”articles//”这个路径的时候,解析的过程如下:

所以最终传递给year_archive()方法中的参数应该是这样的:

当我们访问”articles//”这个路径时,解析的过程如下:

所以最终传递给month_archive()方法中的参数应该是这样的:

再罗嗦一句,因为url()可以指定一个kwargs参数,它是该url关联的view()方法的默认kwargs参数,也就是说如果在url()方法中指定了kwargs,那么会将这个参数的内容,也传递到view方法中的kwargs参数中。

好,至此,url()方法基本上就清楚了,第二个问题也解决了,至于name参数,到下面讲到URL反解的时候再详细解释。

patterns()

接下来,我们来看patterns()方法,这个其实比较简单,它就是返回一个由url()方法构造的URL映射对象组成的列表。它有一个必填参数是prefix,这个prefix是它所包含的view的公共前缀,这么做是为了避免代码重复,比如:

可以写成:

注意,由patterns()生成的列表,被赋值给urlpatterns这个变量,这个变量是不能随便定义的,必须是约定好的,默认django会去URLconf中查找这个变量,也许你可以在某个地方设定一个参数,来换个约定,改变一下这个变量名。

在2.0版本的Django中,会舍弃这个方法,而是直接赋值给urlpatterns一个列表,不做过多讨论。

include()

Python探索之URL Dispatcher实例详解(python urllib urlopen)

我们来说include(),这其实是个难点,关键在于URL反解那里,Django的文档也没有说清楚,而且关系也比较乱,所以,必须得实际的测试一下,才会明白。

上面说过,include()是“树”结构关系的联系者,include会关联其他的URLconf到本URLconf,靠include()才能够让Django的URL设计变得非常的灵活和简洁。include()有三个参数,第一个参数不必多说,它指定了要包含的其它URLconf的路径,关键是剩下的两个参数,一个是namespace, 一个是app_name,有什么用呢?其实,这两个参数再加上url()方法中的name参数,共同构成了Django中URL的命名空间,而命名空间主要是为了URL反解的,那什么是URL反解呢?我们现在能根据请求的一个URL路径,找到对应的view处理方法,那么反过来,我们在view方法中,或者是template中,根据传递过来的参数,能够解析出对应的URL,这就是URL反解。为什么需要URL反解呢?主要是为了不要把程序写死了,如果我们在html中直接把路径写死了,那么以后改起来就会非常的麻烦,所以常常会把这些可变的东西放到一个变量中,在程序中引用的是这个变量名,这是写程序的一个常识吧。所以,我们能从这个“树”中,从上到下,也得能够从下到上。

在template中进行反解使用的是{%url%}这个tag,在view中,进行反解,使用的是`django.core.urlresolvers.reverse()这个方法。

好,先来看一个最简单的例子:

mydjango/urls.py:

model_test/urls.py:

mydjango/urls.py是根URLconf,它包含了model_test的URLconf,modul_test中的urlpatterns中有一个命名为index的url映射对象。

如果我们想在template中得到这个view对应的url的真实路径,那么用template的url tag就行了:

这样得到的结果就是: /model/。

同理,如果在view方法中,那么使用reverve()方法:

得到的也是: /model/

在这个例子中,我们只使用到了url()方法中的name参数,并没有用到命名空间,因为这种简单的情况,没有产生混淆,还没有必要用到命名空间,使用命名空间的主要有以下两种情况:

当在一个项目中,有多个应用,应用中定义的url映射对象的name有可能有重复的,这样当进行反解时,Django就不能确定到底是哪个应用了

当在一个项目中,同一个应用,被部署多个实例时,这多个实例之间是共享定义的name url的,所以在进行反解时,也不能确定,到底是哪个实例

第一种情况,其实是比较好解决的,在每一个应用的include()中,指定不同的namespace参数就可以了,如:

mydjango/urls.py:

这样,在template中或者是reverse中,在name前需要加上namepace进行反解:

这样就可以准确的反解到model_test这个应用中。

第二种情况,什么叫“一个应用,被部署多个实例”呢?其实就是这种情况:

不同的路径下,引用的是相同的应用,同一个应用,被实例化了两次,这种情况,怎么进行区分呢?我能像第一种情况一样,在include中指定不同的namespace来解决问题吗?答案是可行的,但是不推荐。要知道,他们引用的是同一个应用,同一个应用意味着什么,意味着代码是一样的,你在同一份代码中,通过if/else来判断该反解到哪个namespace中,这个做法是非常不优雅的,严重违背了Django的DRY原则。

那Django通过什么办法来解决这个问题呢?它通过app_name + namespace + current_app的方式来解决。namespace, app_name分别为include()的第二个和第三个参数,app_name指定这个应用的名称,namespace指定这个应用某个实例的url的命名空间,current_app则是根据请求的路径,解析出的该url的命名空间,也就是namespace,在进行反解时,动态的将该current_app传递给反解的函数中,反解的函数就可以根据这个namespace,来确定应该反解到哪个实例中了。同一个应用的多个实例的app_name应该是相同的,而namespace应该是不同的。可能有点乱了,我们再来举个例子:

mydjango/urls.py:

model_test/urls.py:

model_test/views.py:

model_test/templates/model/index.html:

在view中,首先获得当前的namespace,然后通过current_app传递给reverse(),reverse就可以知道应该解析到哪个实例中了。同理,在templace中,也需要将current_app传递过去。这样,我们就可以动态的反解URL了:

当我们请求的路径是/model1/时,current_app就是model_1,再根据app_name,就可以准确的反解出该URL为:/model1/,如果请求的路径是/model2/,那么current_app就是model_2,反解的路径就是/model2/。

虽然有点复杂,但是这种情况用的比较少,google了很久,才把这种情况大概弄清楚,也许理解的有不对的地方,待以后实践去检验,现在关键在于理解这种机制思想。

全文完,更多详细的内容,参见Django官方文档: Dispatcher实例详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续啊参阅本站:Python探索之Metaclass初步了解、Python编程之Re模块下的函数介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。

Pandas探索之高性能函数eval和query解析 PythonDataAnalysisLibrary或pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地

Bottle框架中的装饰器类和描述符应用详解 最近在阅读Python微型Web框架Bottle的源码,发现了Bottle中有一个既是装饰器类又是描述符的有趣实现。刚好这两个点是Python比较的难理解,又混合在一起

Python探索之SocketServer详解 SocketServer,网络通信服务器,是Python标准库中的一个模块,其作用是创建网络服务器。SocketServer模块定义了一些类来处理诸如TCP、UDP、UNIX流和UNIX数据报

标签: python urllib urlopen

本文链接地址:https://www.jiuchutong.com/biancheng/368745.html 转载请保留说明!

上一篇:Python探索之Metaclass初步了解

下一篇:Bottle框架中的装饰器类和描述符应用详解(pebble框架)

  • 税控盘白盘和黑盘一样吗
  • 什么叫应纳税所得额
  • 经营活动产生的净现金流量计算公式
  • 增值税抵扣不够怎么解决
  • 企业如何加强应收账款的管理
  • 纳税申报的具体流程个体户
  • 增值税专票销货清单模板
  • 经营租用的设备有哪些
  • 私车公用保险费用公司承担吗
  • 海关缴款书认证不符
  • 营改增后企业取得的不动产可以抵扣进项
  • 增值税普通发票和专用发票有什么区别
  • 不能抵扣的进项税怎么做账
  • 个税个人所得税返回
  • 福利费的进项税额转出
  • 学校有税号可以收专票吗
  • 资产改变用途的法律规定
  • 应税货物销售额怎么计算
  • 上月销售的货物会计分录
  • 支付给业主的赔偿金
  • 报销抵冲银行日记帐要怎么入帐?
  • 应收账款周转天数正常范围
  • 债权性投资和权益性投资的区别
  • 汇算清缴时
  • 资源税计税依据含不含增值税
  • 事业单位财政应返还额度包括
  • 苹果中国区副总裁
  • 进项发票没认证可以开红字申请单吗
  • 该内存不能为read是怎么回事
  • 交易性金融资产是什么意思
  • fsmb32.exe是什么进程 作用是什么 fsmb32进程查询
  • 未能连接到一个windows 的服务win7
  • 斯科默岛白玉草丛中的海鹦,威尔士彭布罗克郡 (© Ross Hoddinott/Minden Pictures)
  • 新办企业工商需要什么手续
  • 工资属于收益类科目吗
  • cjzc框架
  • 深拷贝的实现方式
  • php实现查询功能
  • 增值税多扣款了怎么处理
  • thinkphp登录验证
  • torch.cuda.is_available()
  • js数组分组并排序
  • 销售发票重复开库存商品如何处理?
  • python的shell怎么运行文件
  • 代扣代缴个税手续费返还文件
  • mysql 小时差
  • 房产税从租和从价都要交吗
  • 公司申请破产后债务谁来还
  • 普通费用发票不入账会有什么后果吗
  • 收到现金股利是什么意思
  • 购买服务费用
  • 个税滞纳金怎么计算
  • 折价或溢价摊销属于借款费用
  • 不需要计提折旧的情况
  • 非包销的视同买断的账务处理是?
  • 小规模普票冲红能退税吗?
  • 没有发票的费用支出怎么入账
  • 物业水电费计算
  • 固定资产原价是指固定资产的什么
  • 其他非流动资产包括哪些
  • sql语句中截取字符串
  • encore是什么软件
  • bzc.exe是什么
  • windows8安装密钥永久
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • node.js连接不上数据库
  • js settimeout用法
  • Node.js中的什么模块是用于处理文件和目录的
  • linux命令sed的用法
  • 命令行创建虚拟机
  • 批处理设置ip地址配置的dns
  • shell脚本启动应用程序
  • python爬虫类
  • 第二章,动态添加按钮(Android)
  • python正则函数
  • 国家税务总局全国增值税发票官网
  • 四川国家税务局官网
  • 已抵扣过的进项怎么做账
  • 环保税的税率是怎么算的
  • 企业税费如何计算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设