配置?

Cherrypy中的配置是通過字典實現的。鍵是命名映射值的字符串;值可以是任何類型。

在Cherrypy3中,可以使用配置(文件或dict)直接在引擎、服務器、請求、響應和日志對象上設置屬性。因此,了解配置文件中可用內容的完整范圍的最佳方法是簡單地導入這些對象并查看 help(obj) 告訴你。

注解

如果你是新來的奇瑞,請先看簡單的 basic config 第一節。

建筑?

關于Cherrypy3的配置,你首先需要知道的是它是分開的 全球的 配置自 應用 配置。如果部署多個 應用 同時 site (隨著python web應用程序趨向于去中心化,越來越多的人這樣做了),您還需要小心地分離配置。只有一個“全局配置”,但每個部署的應用都有一個單獨的“應用配置”。

CherryPy 請求 屬于 應用 ,運行在 全球的 上下文和配置數據可以應用于這三個作用域中的任何一個。讓我們依次查看每個范圍。

全局配置?

全局配置條目適用于所有地方,并存儲在 cherrypy.config .這個平面dict只保存全局配置數據,即影響所有已裝入應用程序的“站點范圍”配置條目。

全局配置存儲在 cherrypy.config dict,因此您可以通過調用 cherrypy.config.update(conf) . 這個 conf 參數可以是文件名、打開的文件或配置項的dict。下面是傳遞dict參數的示例:

cherrypy.config.update({'server.socket_host': '64.72.221.48',
                        'server.socket_port': 80,
                       })

這個 server.socket_host 這個例子中的選項決定了Cherrypy將監聽哪個網絡接口。這個 server.socket_port 選項聲明要偵聽的TCP端口。

應用程序配置?

應用程序條目應用于單個已裝入的應用程序,并作為 app.config .這是一個兩級dict,其中每個頂級鍵都是路徑或“相對URL”(例如, "/""/my/page" ,每個值都是配置項的dict。URL與應用程序的腳本名(裝入點)相關。通常,所有這些數據都是在調用 tree.mount(root(), script_name='/path/to', config=conf) ,盡管您也可以使用 app.merge(conf) . 這個 conf 參數可以是文件名、打開的文件或配置項的dict。

配置文件示例:

[/]
tools.trailing_slash.on = False
request.dispatch: cherrypy.dispatch.MethodDispatcher()

或者,在python代碼中:

config = {'/':
    {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.trailing_slash.on': False,
    }
}
cherrypy.tree.mount(Root(), config=config)

Cherrypy只使用以 "/" (除外) [global] ,見下文)。這意味著您可以在cherrypy配置文件中放置自己的配置條目,方法是為它們指定一個不以開頭的節名。 "/" .例如,您可以包括這樣的數據庫條目:

[global]
server.socket_host: "0.0.0.0"

[Databases]
driver: "postgres"
host: "localhost"
port: 5432

[/path]
response.timeout: 6000

然后,在應用程序代碼中,您可以通過 cherrypy.request.app.config['Databases'] .對于在請求過程之外的代碼,您必須傳遞一個對應用程序的引用。

請求配置?

每個請求對象擁有一個 request.config dict.在請求過程的早期,這個dict是通過合并全局配置、應用程序配置和在查找頁面處理程序時獲取的任何配置來填充的(參見下一步)。此dict僅包含適用于給定請求的配置項。

注解

當你做一個 InternalRedirect ,將為新路徑重新計算此配置屬性。

宣言?

配置數據可以作為python字典、文件名或打開的文件對象提供。

配置文件?

當您提供一個文件名或文件時,cherrypy使用了python的內置configparser;通過將每個路徑寫為一個節頭,并將每個條目寫為 "key: value" (或) "key = value" )配對:

[/path/to/my/page]
response.stream: True
tools.trailing_slash.extra = False

組合配置文件?

如果您只部署一個應用程序,那么可以創建一個包含全局和應用程序條目的配置文件。只需將全局條目插入名為 [global] ,并將同一文件傳遞給 config.updatetree.mount <cherrypy._cptree.Tree.mount() .如果你打電話來 cherrypy.quickstart(app root, script name, config) ,它將為您將配置傳遞到兩個位置。但一旦決定向同一站點添加另一個應用程序,就需要將兩個配置文件/dict分開。

單獨的配置文件?

如果在同一進程中部署多個應用程序,則需要(1)個文件用于全局配置,以及(1)個文件用于 each 應用程序。全局配置通過調用 cherrypy.config.update 和應用程序配置通常在調用中傳遞給 cherrypy.tree.mount .

一般來說,您應該首先設置全局配置,然后用自己的配置裝載每個應用程序。除其他好處外,這允許您設置全局日志記錄,以便在嘗試裝載應用程序時出錯時,可以看到跟蹤。換言之,使用以下順序:

# global config
cherrypy.config.update({'environment': 'production',
                        'log.error_file': 'site.log',
                        # ...
                        })

# Mount each app and pass it its own config
cherrypy.tree.mount(root1, "", appconf1)
cherrypy.tree.mount(root2, "/forum", appconf2)
cherrypy.tree.mount(root3, "/blog", appconf3)

if hasattr(cherrypy.engine, 'block'):
    # 3.1 syntax
    cherrypy.engine.start()
    cherrypy.engine.block()
else:
    # 3.0 syntax
    cherrypy.server.quickstart()
    cherrypy.engine.start()

配置文件中的值使用python語法?

配置項始終是鍵/值對,例如 server.socket_port = 8080 .鍵始終是名稱,值始終是Python對象。也就是說,如果您設置的值是 int (或其他數字),它需要看起來像一條 Python int 例如, 8080 .如果該值是一個字符串,則需要引用它,就像python字符串一樣。也可以創建任意對象,就像在Python代碼中一樣(假定可以找到/導入這些對象)。下面是一個擴展示例,向您展示了一些不同的類型:

[global]
log.error_file: "/home/fumanchu/myapp.log"
environment = 'production'
server.max_request_body_size: 1200

[/myapp]
tools.trailing_slash.on = False
request.dispatch: cherrypy.dispatch.MethodDispatcher()

_ cp_-config:將config附加到處理程序?

配置文件有一個嚴重的限制:值總是由URL鍵控。例如:

[/path/to/page]
methods_with_bodies = ("POST", "PUT", "PROPPATCH")

很明顯,額外的方法是該路徑的規范;事實上,如果沒有它,代碼可能會被認為是被破壞的。在Cherrypy中,可以將該配置位直接附加到頁面處理程序上:

@cherrypy.expose
def page(self):
    return "Hello, world!"
page._cp_config = {"request.methods_with_bodies": ("POST", "PUT", "PROPPATCH")}

_cp_config 是調度程序在對象樹中的每個節點上查找的保留屬性。這個 _cp_config 屬性必須是Cherrypy配置字典。如果調度員發現 _cp_config 屬性,它將字典合并到配置的其余部分。整個合并的配置字典都放在 cherrypy.request.config .

這可以在對象樹的任意點上完成;例如,我們可以將該配置附加到包含page方法的類上:

class SetOPages:

    _cp_config = {"request.methods_with_bodies": ("POST", "PUT", "PROPPATCH")}

    @cherrypy.expose
    def page(self):
        return "Hullo, Werld!"

注解

只有默認的調度器才能保證這種行為。其他調度員可能對可以附加的位置有不同的限制 _cp_config 屬性。另外,因為調度員負責處理 _cp_config ,無法更改調度員(即 request.dispatch 在這個構造中不受尊重)。

此技術允許您:

  • 把config放在它用來提高可讀性和可維護性的地方。

  • 將config附加到對象而不是url。這允許多個url指向同一個對象,但您只需要定義一次config。

  • 提供在配置文件中仍然可重寫的默認值。

命名空間?

因為配置條目通常只設置對象的屬性,所以它們幾乎都是表單的組成部分: object.attribute .一些是這樣的形式: object.subobject.attribute .它們看起來像普通的python屬性鏈,因為它們的工作方式與它們類似。我們把這條鏈子的名字叫做 “配置命名空間” .當您提供一個配置條目時,它將盡可能早地綁定到命名空間引用的實際對象;例如,條目 response.stream 實際上設置 stream 屬性 cherrypy.response 你看!通過這種方式,您可以通過啟動Python解釋器并鍵入以下內容輕松確定默認值:

>>> import cherrypy
>>> cherrypy.response.stream
False

每個配置名稱空間都有自己的處理程序;例如,“請求”名稱空間有一個處理程序,它接受配置條目并在相應的“請求”屬性上設置該值。但是,有一些名稱空間并不像場景后面的普通屬性那樣工作;但是,它們仍然使用點鍵,并被認為是“有名稱空間”。

內置命名空間?

在全局應用程序根目錄中,可以允許來自每個命名空間的條目 ("/" )或按路徑配置,或組合:

范圍

全球的

應用程序根

應用程序路徑

發動機

X

鉤子

X

X

X

日志

X

X

請求

X

X

X

響應

X

X

X

服務器

X

工具

X

X

X

發動機?

此命名空間中的條目控制“應用程序引擎”。這些只能在全局配置中聲明。的任何屬性 cherrypy.engine 可以在config中設置;但是,config中有一些額外的條目可用:

  • 插件屬性。很多 Engine Plugins 他們本身就是 cherrypy.engine .您可以通過簡單地命名附加插件來設置它的任何屬性。例如,有一個 Autoreloader 上課時間: engine.autoreload ;您可以通過config條目設置其“frequency”屬性。 engine.autoreload.frequency = 60 .此外,您可以通過設置 engine.autoreload.on = TrueFalse .

  • engine.SIGHUP/SIGTERM :這些條目可用于為給定的 channel .大多數情況下,這用于關閉自動通過 cherrypy.quickstart() .

鉤子?

聲明其他請求處理函數。用這個附加你自己的 Hook 請求的函數。例如,添加 my_hook_funcbefore_handler 掛鉤點:

[/]
hooks.before_handler = myapp.my_hook_func

日志?

配置日志記錄。這些只能在全局配置(用于全局日志記錄)中聲明,或者 [/] 配置(針對每個應用程序)。參見 LogManager 用于可配置屬性列表。通常,“訪問文件”、“錯誤文件”和“屏幕”屬性是最常見的配置。

請求?

為每個請求設置屬性。查看 Request 類獲取完整列表。

響應?

設置每個響應的屬性。查看 Response 類獲取完整列表。

服務器?

通過控制默認HTTP服務器 cherrypy.server (有關可配置屬性的完整列表,請參見該類)。這些只能在全局配置中聲明。

工具?

啟用和配置其他請求處理包。查看 /tutorial/tools 概述了解更多信息。

WSGi?

將wsgi中間件添加到應用程序的“管道”。這些只能在應用程序的根配置(“/”)中聲明。

  • wsgi.pipeline :附加到wsgi管道。該值必須是(名稱、應用程序工廠)對的列表。每個應用程序工廠必須是一個wsgi可調用類(或返回wsgi可調用的可調用類);它必須接受一個初始的“nextap”參數,以及任何可選的關鍵字參數??蛇x參數可通過以下方式配置: wsgi.<name>.<arg> .

  • wsgi.response_class :覆蓋默認值 Response 班級。

棋盤格?

控制“檢查器”,它在引擎啟動時查找應用程序狀態(包括配置)中的常見錯誤。您可以通過將單個支票設置為 False 在配置中。參見 cherrypy._cpchecker.Checker 以獲取完整的列表。僅全局配置。

自定義配置命名空間?

如果愿意的話,您可以定義自己的名稱空間,它們可以做的遠不止設置屬性。這個 test/test_config 例如,模塊顯示了強制傳入參數和傳出正文內容的自定義命名空間的示例。這個 cherrypy._cpwsgi 模塊包括一個額外的內置命名空間,用于調用WSGi中間件。

本質上,配置名稱空間處理程序只是一個函數,它在其名稱空間中傳遞任何配置項。將其添加到名稱空間注冊表(dict),其中鍵是名稱空間名稱,值是處理程序函數。當遇到命名空間的配置項時,將調用相應的處理程序函數,并傳遞配置鍵和值;也就是說, namespaces[namespace](k, v) .例如,如果你寫:

def db_namespace(k, v):
    if k == 'connstring':
        orm.connect(v)
cherrypy.config.namespaces['db'] = db_namespace

然后 cherrypy.config.update({{"db.connstring": "Oracle:host=1.10.100.200;sid=TEST"}}) 將呼叫 db_namespace('connstring', 'Oracle:host=1.10.100.200;sid=TEST') .

調用命名空間處理程序的位置取決于添加它的位置:

范圍

命名空間dict

調用了處理程序

全球的

cherrypy.config.namespaces

cherrypy.config.update

應用

app.namespaces

application.merge(由cherrypy.tree.mount調用)

請求

app.request_class.namespaces

request.configure(在查找處理程序后為每個請求調用)

名稱可以是任何字符串,處理程序必須是可調用的或(python 2.5樣式)上下文管理器。

如果需要在收集所有命名空間鍵時運行其他代碼,可以為處理程序提供一個可調用的上下文管理器,而不是普通函數。上下文管理器在中定義 PEP 343 .

環境?

命名空間中不存在的唯一鍵是 “環境” 進入。它僅適用于全局配置,并且僅在使用 cherrypy.config.update .這個特別條目 進口 以下模板中存儲的其他配置項 cherrypy._cpconfig.environments[environment] .

Config.environments = environments = {
    'staging': {
        'engine.autoreload.on': False,
        'checker.on': False,
        'tools.log_headers.on': False,
        'request.show_tracebacks': False,
        'request.show_mismatched_params': False,
    },
    'production': {
        'engine.autoreload.on': False,
        'checker.on': False,
        'tools.log_headers.on': False,
        'request.show_tracebacks': False,
        'request.show_mismatched_params': False,
        'log.screen': False,
    },
    'embedded': {
        # For use with CherryPy embedded in another deployment stack.
        'engine.autoreload.on': False,
        'checker.on': False,
        'tools.log_headers.on': False,
        'request.show_tracebacks': False,
        'request.show_mismatched_params': False,
        'log.screen': False,
        'engine.SIGHUP': None,
        'engine.SIGTERM': None,
    },
    'test_suite': {
        'engine.autoreload.on': False,
        'checker.on': False,
        'tools.log_headers.on': False,
        'request.show_tracebacks': True,
        'request.show_mismatched_params': True,
        'log.screen': False,
    },
}

如果您發現現有環境集(生產、分段等)太過局限或完全錯誤,請隨意擴展它們或添加新環境:

cherrypy._cpconfig.environments['staging']['log.screen'] = False

cherrypy._cpconfig.environments['Greek'] = {
    'tools.encode.encoding': 'ISO-8859-7',
    'tools.decode.encoding': 'ISO-8859-7',
    }