Paste deploy Python

2024-04-08 05:32
文章标签 python deploy paste

本文主要是介绍Paste deploy Python,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

帮助文档http://pythonpaste.org/deploy/module-paste.deploy.html

Paste Deployment是用于发现和配置WSGI appliactionserver的系统。对于WSGI application用户提供一个单独的简单的函数(loadapp),用于从配置文件或者python egg中加载WSGI application。因为WSGI application提供了唯一的单独简单的访问入口,所以application 发布者并不需要暴露application的内部的实现细节。

那么系统管理员可在不了解任何python知识或者WSGI Application或者WSGI container的情况下进行安装和管理。Paste Deployment目前已经不需要Paste项目的其他部分支持,可以单独做一个package进行使用。Paste Deploy的发布在MIT license

Paste Deploy目前已经通过了V1.0

必须注意的地方: Paste Deploy 最关键的地方是入口点 entry points (例如, paste.app_factory (入口点是 python  项目发布时定义的,并且会指定发布的程序的入口点符合的 protocal的种类,后面会有介绍 并不是这些入口点唯一的使用者,很多扩展可能直接去使用这些入口点,这样做可能比通过 Paste Deploy 使用更好。入口点是不能发生变化的,如果改变是必须的话,只能定义新的入口点。

1.1.1.    Paste.deploy  基本的使用

可以使用Paste Deployment用于加载WSGI的应用,大多数的Python框架都支持WSGI。主要的函数是paste.deploy.loadapp,基本使用方法如下:

from   paste.deploy   import  loadapp wsgi_app  =  loadapp( 'config:/path/to/config.ini' )

目前支持两种URI模式config:和egg

 

1.1.1.1.            config:URIs

config:URIs——URI表示配置文件(不同于3.3.1节的配置文件,此处的配置文件是用于指示,所需要加载的application是哪些)的位置

配置文件的格式:

[section_name]

key = value

another key = a long value

 that extends over multiple lines

所有的value都是string类型,keysection name都是大小写敏感的,并且可以包含标点符号和空白符,但是头部和尾部的空白部分将会去掉。

如果出现需要断行的情况,只需要在下一行开始时是空白符即可

#;表示注释。

配置文件中可能会定义多个application,定义方式如下:

application定义

在一个文件中可以定义多个application,每个application都应该有自己独立的section,即使仅有一个application存在,也需要写入到section中。

每个定义一个applicationsection都应该以app:前缀开头。main section进入[appmain][app]

指定运行applicationPython code方式有两种:

第一种方法,指向其他的URI(前两个section)或name(后两个section

[app:myapp]

use = config:another_config_file.ini#app_name

#调用其他的配置文件(可能定义了多个应用程序),并需要执行的应用程序的名称

 

# or any URI:

[app:myotherapp]

use = egg:MyApp

 

# or a callable from a module:

[app:mythirdapp]

use = call:my.project:myapplication

 

# or even another section:

[app:mylastapp]

use = myotherapp

Configuration

配置了use字段或者通过协议名称(上面提到的两种方法),就完成了配置文件最基本的配置,section中其他的key都会作为关键字参数传递给factory。下面看一个例子:

[app:blog]

use = egg:MyBlog

database = mysql://localhost/blogdb

blogname = This Is My Blog!

定义了一个application,名字为blog,运行的程序是MyBlog(他是一个egg),需要传递给MyBlog的参数是databaseblogname

这里有个比较有趣的例子,我们可以再定义另外一个section去覆盖上面的配置,如下:

[app:otherblog]

use = blog

blogname = The other face of my blog

use = blog”表明使用的应用程序是section blog

但是传递的参数是:blogname = The other face of my blog,覆盖掉了section blog的对应的配置信息。这种设置方式也可以定义在普通的配置文件中,即使用use = config:other_config_file 这种方式进行。

这种方式看起来好像是没什么意义的,只是从一个位置指向另一个位置,而实际上这对于增添和更新application是非常有效的。

Global Configuration

当多个application需要共享相同的配置时,我们可以采用上述的方法,使用其他的section,如果想要不同的value值,则重新定义覆盖掉它。但是这种方法,不能够添加其他的配置参数,即只能覆盖掉usesection中已经定义的部分。

所以可以采用[DEFUALT]方法定义全局的配置信息,[DEFUALT]的配置信息将会全部传入到所有的Application中,通常情况下,也可作为application的默认设置。application可以自主定义覆盖全局的默认值

为免去对所有application配置全局共享信息的麻烦可以使用[DEUALT]section,注意DEFUALT是大小写敏感的。

[DEFAULT]

admin_email = webmaster@example.com

 

[app:main]

use = ...

set admin_email = bob@example.com

set关键字使用,将会覆盖掉global的对应的配置。

第二种方法,精确定义application需要运行的Python code

[app:myapp]

paste.app_factory = myapp.modulename:app_factory

这种方式必须明确指定使用的protocol(此例中是paste.app_factory),value值表示需要import的内容。此例中是import myapp.modulename,然后检测app_factory执行

application的其他类型:composition application

composition application:类似与application,但是他是由多个application组成的,一个简单的例子就是URL mapper,例如,

[composite:main]

use = egg:Paste#urlmap

/ = mainapp

/files = staticapp

 

[app:mainapp]

use = egg:MyApp

 

[app:staticapp]

use = egg:Paste#static

document_root = /path/to/docroot

使用loadapp加载composition application “main” 看起来就是和其他应用程序相同的,仅是一个application,但是根据配置文件的设置,“main”是可以访问其他的application的。

filter composition

可以采用不同的方式将filter应用到application中,通常情况下依赖于需要使用多少个filter和使用filter的顺序。

第一种方法:filter-with设置

[app:main]

use = egg:MyEgg

filter-with = printdebug

 

[filter:printdebug]

use = egg:Paste#printdebug

# and you could have another filter-with here, and so on...

另一种方法:filter-app pipeline

此外,还有两个特殊的section可以添加filterapplication中去:[filter-app:] [pipeline:]

filter-app定义一个filter,并且使用一个特殊的关键字next指向application,将application添加到filter(这与[filter:…]很类似)

pipeline:当需要定义一系列的fiter时应用。在configuration中添加关键字pipelinepipeline是一个filters的链表,以一个application结束,例如

[pipeline:main]

pipeline = filter1 egg:FilterEgg#filter2 filter3 app

 

[filter:filter1]

...

注:参考博文http://blog.csdn.net/sonicatnoc/article/details/6539716

里面描述filter调用的顺序,其实是一个嵌套的过程,调用的过程是不断的返回

filter1->filter2->filter3->……->end_app

执行的时候是

end_app->……->filter3->filter2->filter1

1.1.1.1.            配置文件简单例子

Paste Deploy交互的主要方式是通过配置文件,一个非常简单配置文件的例子如下:

[app:main]

use = egg:PasteEnabledPackage

option1 = foo

option2 = bar

 

[server:main]

use = egg:PasteScript#wsgiutils

host = 127.0.0.1

port = 80

每个[]表示一个section,彼此间是独立的。

[type:name]

[app:main]Paste Deploy认为是一个名字为mainapplication

配置文件的内容都是以“name=value”的形式进行表示的,如果有多个value,那么就表示为“ name = value1#value2#value3”类似的模式。

[app:main]appliction section

[server:main]server section

[composite:…]用于调度多个applicationcompostion是复合的意思

 

 

 

use = egg:PasteEnabledPackage

表示名为PasteEnabledPackagePackage将被运行,这个Package的格式是egg的格式。而后面的字段,将作为关键字参数传递给PastEnablePackage

2section[servermain],名为mainserver

use = egg:PasteScript#wsgiutils

表示使用发布的egg文件PasteScript中的wsgiutils程序

官网上的例子

[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

 

[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:wiki]

use = call:mywiki.main:application

database = sqlite:/home/me/wiki.db

先看[composite:main]section,这是一个composite类型的section,意味着将会调度请求到其他的application中去。use = egg:Paste#urlmap,表明使用的compostite AppliacitonPaste.urlmapurlmap是一个特殊的composite application,它可以根据请求的前缀,调度到其他的application中去。如配置文件中所示

[composite:main]

use = egg:Paste#urlmap

/ = home #请求前缀“/”转去home application

/blog = blog  #请求前缀“/blog”转去blog application

/wiki = wiki #请求前缀“/wiki”转去wiki application

/cms = config:cms.ini # just refers to another file cms.ini in the same directory.

[app:home]section

[app:home]

use = egg:Paste#static

document_root = %(here)s/htdocs

其他部分

[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:wiki]

[app:wiki]

use = call:mywiki.main:application

database = sqlite:/home/me/wiki.db

 

1.1.1.2.            egg: URIs

Python Egg是使用setuptools发布和安装形式,并且将metadata添加到普通的Python package

对于egg有两个重要的地方:

第一,specificaition——name关键字指定egg 的名字,并且能够指定egg的版本号

第二,entry point —— 指向了你创建的packagesPython Object,并且指明Protocol的具体类型。

swiftsetup.py为例:protocolpaste.app_factory,包含的应用程序名称是proxyobjectcontaineraccount,你可以通过egg:egg名字#应用程序名字获取应用程序服务,以swift为例

name=’swift’

那么object应用程序的URI表示为egg:swift#object

value是导入objects的命令,主入口函数在swift.obj.serverapp_factory函数

 SHAPE  \* MERGEFORMAT

entry_points={

        'paste.app_factory': [

            'proxy=swift.proxy.server:app_factory',

            'object=swift.obj.server:app_factory',

            'container=swift.container.server:app_factory',

            'account=swift.account.server:app_factory',

            ],

      是一个callable object是在ini文件中default section中定义的一系列key-value对,而**kwargs,即一些本地配置,是在ini文件中,filter:xxx section中定义的一系列key-value对。filter_factory<span times="" new="" roman";="" mso-hansi-font-family:"times="" roman";mso-bidi-font-family:"times="" mso-font-kerning:1.0pt;mso-ansi-language:en-us;mso-fareast-language:zh-cn;="" mso-bidi-language:ar-sa"="" style="word-wrap: break-word; font-size: 10.5pt; font-family: 宋体;">返回一个filter对象

这篇关于Paste deploy Python的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884683

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很