paste deploy 学习笔记

  谈到WSGI,就免不了要了解paste,其中paste deploy是用来发现和配置WSGI应用的一套系统,对于WSGI应用的使用者而言,可以方便地从配置文件汇总加载WSGI应用(loadapp);对于WSGI应用的开发人员而言,只需要给自己的应用提供一套简单的入口点即可。

  paste deploy的官方介绍在这里,其发布在Pypi上的发行包在这里下载。借助Python的pypi包管理机制,我们可以非常方便地安装PasteDeploy:

# pip install PasteDeploy

  既然PasteDeploy是用来配置和管理WSGI 应用的,不妨首先看一下PasteDeploy配置文件的格式。

  一、PasteDeploy配置文件格式

  PasteDeploy配置文件由若干section组成,section的声明格式如下:

  [type:name]

  其中,方括号括起的section声明一个新section的开始,section的声明由两部分组成,section的类型(type)和section的名称(name),如:[app:main]等。section的type可以有:app、composite、filter、pipeline、filter-app等。

  每个section中具体配置项的格式就是基本的ini格式:key = value,此外,PasteDeploy的配置文件中使用“#”标注注释。

  在基本了解PasteDeploy配置文件的书写格式后,我们不妨看一个实例,来具体了解不同type的section。

  

  二、PasteDeploy中section的type

  

  示例1:PasteDeploy配置文件

  [composite:main]
  use = egg:Paste#urlmap
  / = home
  /blog = blog
  /wiki = wiki
  /cms = config:cms.ini

  [app:home]
  use = egg:Paste#static
  document_root = %(here)s/htdocs

  [app:wiki]
  use = call:mywiki.main:application
  database = sqlite:/home/me/wiki.db

  [filter-app:blog]
  use = egg:Authentication#auth
  next = blogapp
  roles = admin
  htpasswd = /home/me/users.htpasswd 

  [app:blogapp]
  use = egg:BlogApp
  database = sqlite:/home/me/blog.db

  [app:main]
  use = egg:MyEgg
  filter-with = printdebug

  [filter:printdebug]
  use = egg:Paste#printdebug 

  [pipeline:main]
  pipeline = filter1 filter2 filter3 app  ...

  上面的示例文件列出了若干不同type的section示意,下面就一一探讨PasteDeploy可定义的section type.

  

  2.1  Type = composite(组合应用)

  顾名思义,组合应用由若干WSGI应用组成,composite为这些应用提供更高一层的分配工作。

  我们具体分析示例1中的如下部分:

[composite:main]
use = egg:Paste#urlmap
/ = home
/blog = blog
/wiki = wiki
/cms = config:cms.ini

  该段配置文件定义了一个名为main、类型为composite的section,方括号的声明以下是该section的具体配置,遵循 key = value 的统一格式。

  Composite类型的section将URL请求分配给其他的WSGI应用。 use = egg:Paste#urlmap 意味着使用 Paste 包中的 urlmap 应用。urlmap是Paste提供的一套通用的composite应用,作用就是根据用户请求的URL前缀,将用户请求映射到对应的WSGI应用上去。这里的WSGI应用有:"home", "blog", "wiki" 和 "config:cms.ini"。

  最后一项仅仅是参考了同一个目录中的另一个文件"cms.ini"

  

  2.2  Type = app(WSGI应用)

  

  回到示例1中的下一部分:

[app:home]
use = egg:Paste#static
document_root = %(here)s/htdocs

[app:wiki]
use = call:mywiki.main:application
database = sqlite:/home/me/wiki.db

  app类型的section声明一个具体的WSGI应用。调用哪个python module中的app代码则由的use后的值指定。

  这里的 egg:Paste#static 是另一个简单应用,作用仅仅是呈现静态页面。它接收了一个配置项: document_root ,后面的值可以从全局配置[DEFAULT](大小写敏感)中提取,提取方法s是使用变量替换:比如  %(var_name)s 的形式。

  这里 %(here)s 的意思是这个示例配置文件所在的目录,因为相对路径在不同服务器中的解释方法不同,出于移植性的考虑,官方文档上推荐当前这种写法。

  示例中定义了多个app类型的section,因为PasteDeploy的配置文件中允许定义多个app类型的section,同时要求每个WSGI应用也都应该拥有自己的section。这样,每一个WSGI应用在配置文件中都有一个app类型的section与之对应,默认地,"main"应用对应于 app:main 或 app 。

  应用的具体实现要在section中配置,有两种方法专门用于指出应用对应的代码:使用URI(用use标识)或 直接指向实现代码(用protocol标识)。

  

  2.2.1  使用另一个URI

  采用该方法的特点是指出应用的实现代码的那一条 key = value 配置项采用"use"作为键,该方法也有许多变种,官方的示例中给出了一些介绍:

[app:myapp]
use = config:another_config_file.ini#app_name

# 或任意URI:
[app:myotherapp]
use = egg:MyApp

# 或指明某个模块中的可调用:
[app:mythirdapp]
use = call:my.project:myapplication

# 甚至是其他的section:
[app:mylastapp]
use = myotherapp

  最后指向其他的section的那个例子,看起来似乎没有什么意义,似乎只是两个相同的WSGI应用。但是这样的定义允许我们在 [app:mylastapp] 这个应用中定义一些局部的配置项,从而在重用代码的同时覆写它引用的应用配置。

  2.2.2  直接指向应用的实现代码

  采用该方法的特点是指出实现代码的那一条 key = value 配置项采用“协议”作为键,所谓“协议”即protocol,告诉PasteDeploy即将加载的对象类型,如:

[app:myapp]
paste.app_factory = myapp.modulename:app_factory

  该例的protocol paste.app_factory 是一个应用的工厂函数,指明import对象的类型;值 myapp.modulename:app_factory 指明具体加载的模块和方法。

  关于PasteDeploy的协议,进而可以定义的工厂函数类型,我们在下文对所有section可选的type有一定的了解后再进行探讨。

  

  2.3  Type = filter(过滤器)

  

  filter是作用于WSGI应用上的函数或方法,以app为唯一的参数,并返回一个“过滤”后的app。归功于WSGI接口的规范,不同的filter可以依次“过滤”某一app,事实上多个filter处理一个app也就是下文中提到的管道(pipeline)。

  在PasteDeploy的配置文件中有多种方法来“过滤”应用,比如示例1中:

[app:main]
use = egg:MyEgg
filter-with = printdebug

[filter:printdebug]
use = egg:Paste#printdebug

  在 [app:main] 的 filter-with 字段指明用来处理该应用的filter,就指定了名为"printdebug"的filter来处理应用"main"。在 [filter:printdebug] 中还可以定义新的 filter-with 字段,从而将处理关系延续下去。

  

  2.4  Type = filter-app

  

  同样是处理应用,在PasteDeploy配置文件中可以有着不同的写法,比如示例1中的下面部分,就是使用filter-app类型的section来声明一个filter:

[filter-app:blog]
use = egg:Authentication#auth
next = blogapp
roles = admin
htpasswd = /home/me/users.htpasswd 

[app:blogapp]
use = egg:BlogApp
database = sqlite:/home/me/blog.db

  该部分采用了[filter-app:NAME]类型的section声明了一个filter,指定使用的代码,以及要处理的应用: next 字段的值。从而PasteDeploy会自动地将过滤器"blog"作用在应用"blogapp"上。

  2.5  Type = pipeline

  pipeline便于对一个应用添加多个过滤器,比如示例1中:

[pipeline:main]
pipeline = filter1 filter2 filter3 app

  就指定了在app上施加三个filter进行处理。

  总结起来,想要在某个应用前添加多个filter,共有 [filter-app:...]  [pipeline:...] 和 [app:...] filter-with = ... 等方法。

  三、局部配置与全局配置

  3.1  局部配置与全局配置的格式

  PasteDeploy配置文件的所有配置项均使用 key = value 格式,但是局部配置项和全局配置项定义的位置不同。如:

[app:blog]
use = egg:MyBlog
database = mysql://localhost/blogdb
blogname = This Is My Blog!

[app:otherblog]
use = blog
blogname = The other face of my blog

  每一个section内设置具体的键值关系,构成这些section自己的局部配置。

  为了便于不同的应用读取某些固定的系统信息,PasteDeploy允许设置全局配置变量,所有的全局配置必须放在[DEFAULT]字段下设置,如:

[DEFAULT]
admin_email = [email protected]

[app:main]
use = ...
set admin_email = [email protected]

  注意[DEFAULT]段名是大小写敏感的,因此必须严格大写。

  3.2  局部配置和全局配置的覆写

  3.1中的两个例子,实际上展示了局部配置和全局配置的覆写,这里详细介绍,首先看局部配置的覆写:

[app:blog]
use = egg:MyBlog
database = mysql://localhost/blogdb
blogname = This Is My Blog!

[app:otherblog]
use = blog
blogname = The other face of my blog

  从2.2.1中已经知道,一些section可以直接复用其他section的代码,并定制配置信息,这里 [app:otherblog] 就采用了 [app:blog] 的代码,同时将配置项 blogname 改为自己特定的。

  另一方面,应用在本地可以修改全局配置项的值:

[DEFAULT]
admin_email = [email protected]

[app:main]
use = ...
set admin_email = [email protected]

  只需要在要覆写的键前加 set 即可。

  

  至于为什么要探讨局部配置与全局配置,是因为二者在传递给不同类型的factory function时对应的参数不同,这些将在下文详细探讨。

  四、实现factory

  本文的第二部分探讨了PasteDeploy中的若干种“协议”,事实上对应了实现时的不同类型,包括 paste.app_factory  paste.composite_factory  paste.filter_factory  paste.server_factory 等。

  这些“协议”封装WSGI应用,使其成为app、composite、filter等类型的组件,这些factory对应的格式有

  4.1  paste.app_factory

  4.2  paste.composite_factory

  4.3  paste.filter_factory

  

  4.4  paste.filter_app_factory

  4.5  paste.server_factory

  

  4.6  paste.server_runner

时间: 2024-10-11 01:01:48

paste deploy 学习笔记的相关文章

Python Paste.deploy 笔记

首先python paste是一个WSGI工具包,在WSGI的基础上包装了几层,让应用管理和实现变得方便.说实话,Python Paste的文档做的真差劲!加之python代码可读性本来就不怎么滴,真费劲. paste.deploy关键部分留个抓印: 1)python paste.deploy不能只装个paste.deploy包就可以工作了,还需要paste.script包 2)python paste.deploy中loadapp给的路径可用os.path.abspath(配置文件相对路径)得

Maven学习笔记之——仓库(上)

Maven学习笔记之--仓库(上) 1.    何为maven仓库 Maven可以在某一指定位置统一存放所有maven项目共享的构件.此指定位置就是maven仓库.实际的项目将不再自己存放其所依赖的构件.他们只需要声明这些依赖的坐标.在需要的时候就会自动根据坐标找到仓库中的构件.并使用他们. 仓库的意义:减少磁盘占用空间.去除大量重复的构件.尤其是项目越来越多.越来越大的时候.更便于统一管理所有控件. 2.    仓库的布局 任何一个构件都有其唯一的坐标.根据这个坐标可以定义其在仓库中的唯一存储

angularjs学习笔记—事件指令

angularjs学习笔记—事件指令 小俞 4.4k 3月30日 发布 推荐 4 推荐 收藏 17 收藏,11.1k 浏览 ngClick 适用标签:所有触发条件:单击 #html <div ng-controller="LearnCtrl"> <div ng-click="click()">click me</div> <button ng-click="click()">click me<

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

Linux 操作系统学习笔记

一,unix 1.unix 特点 伸缩性强,开放性好, 2.基本原则 所有对象,硬件都是文件 配置数据以文本形式保存 短小的单目的程序构成 多个程序合作完成复杂任务 3.gnu 基本原则是共享,建立自由开放的unix系统 1984年 richard stallman 发起 基本体系是micro kernel 4.gpl Copyleft 原作者所有权 5.linux起源 Linustorvalds, 自由的类unix操作系统, 遵循gnu和gpl 6.linux 可以实现unix功能 遵循开源许

Nutch学习笔记——抓取过程简析

Nutch学习笔记二--抓取过程简析 学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika.gora. 先安装SVN和Ant环境.(通过编译源码方式来使用nutch) apt-get install ant apt-get install subversion [email protected]:~/data/nutch$ svn co https:

GAE学习笔记(一):用Eclipse部署第一个GAE项目

前期准备: 首先你要有一个Google账号. 创建一个GAE应用.相信大家在学习翻墙的时候就已经知道怎么弄了,这里就不多说了.不清楚的请百度"GoAgent". 记住该应用的application ID,后面项目部署的时候会用到. ? 在Eclipse搭建GAE开发环境: 截至本文发布时,GAE插件只支持Java 7.(如有变化,请到官方网站确认https://developers.google.com/eclipse/docs/download) 请将Eclipse的JRE设置为JR

paste deploy初探

这段时间刚着手开始研究Openstack Swift源码,为后续开发做准备. Swift依据python WSGI规范.WSGI(Web Server Gateway Interface)是Python应用程序或框架与Web服务器之间的一种接口,定义了一套借口来实现服务器与应用端的通信规范.按照一套规范,应用端想要通信,很简单,只需要实现一个接受两个参数的,含有__call__方法并返回一个可遍历的含有零个或者多个string结果的python对象.  而paste.deploy(Paste D

CKEditor学习笔记2(CKEditor基本配置修改)

第二篇,围绕这5个问题进行基本配置: 1.自定义ToolbarSet,去掉一些功能 2.加上几种常用的字体 3.修改"回车"和"Shift+回车"的换行行为 4.修改编辑区样式文件 5.更换表情图片 这些信息的配置,可以通过config.js文件进行,当然也可以创建自己的配置文件. 可以参考我的步骤: 1.首先创建一个目录custom,接着在该目录内新建一个myConfig.js配置文件. 2.JavaScript调用方式二(上一篇内容),修改为: CKEDITOR