2012-03-10 65 views
2

我想知道如何在運行時編輯金字塔註冊表。那麼我不太確定我需要編輯的東西。動態添加路線到金字塔

我知道我可以用config.include(...)擴展金字塔。但是一旦調用config.make_wsgi_app(),似乎就無法添加路由或新的mako目錄。對threadlocals或設置中的註冊進行的任何更改都不會影響應用程序的行爲。

我的目標是在運行時添加插件。這是一個用例。

有人安裝我的應用程序服務器上運行的金字塔......然後安裝一些插件

PIP安裝page_plugin

然後在/ CONFIGS

有安裝的插件列表中,您可以選擇哪些激活與否。目前我只知道一種方法:

使用entry_points我可以看到我的插件和金字塔的主要功能,我可以註冊插件。使用文件存儲我可以檢查每個插件狀態:[安裝,安裝,卸載,卸載,禁用]

這樣我可以從視圖安裝/卸載我的插件。

爲了看到任何更改,我必須重新啓動服務器。

狀態 安裝:將安裝在安裝下一個啓動 :安裝和積極 卸載:將卸載在卸載下次啓動 :卸載 禁用:不能卸載,但是沒有被激活

安裝/卸載正在使用根據需要設置數據庫

我認爲沒有其他方法可以做到,因爲沒有「remove_view」。我可以讓服務器重新加載。它會加載新的配置。

[編輯]

沒有功能來刪除路由或反基因。所以我的猜測是,對服務器進行重新編碼可能是最簡單和最簡單的方法......重啓服務器可能比忘記從插件中卸載一些東西更清潔。

回答

2

有可能修改註冊表在運行時:

config = Configurator(registry=request.registry) 
config.add_route(...) 
config.commit() 

你必須然而,必須指出的是,修改註冊表是不是線程安全的操作。你必須自己同步這個。我會建議以不同的方式考慮您的問題,並嘗試創建涵蓋您預期擴展的功能的路線,而不是這樣做。路線可以接受模式(如果需要URL的其餘部分,甚至可以使用.*),並且還有遍歷,這是非常非常動態的,並且在運行時很容易擴展。

添加可移動的視圖是可能的,但我不會在「添加或刪除路線」級別。相反,我建議在您的路線上使用自定義謂詞來控制路線是否匹配。

def is_enabled(info, request): 
    return True if route_should_be_enabled else False 

config.add_route('my_plugin_head', '/foo/{bar}', custom_predicates=[is_enabled]) 

以這種方式,如果is_enabled返回False,則路由永遠不會匹配,並且會被有效忽略。

+0

這真的很有趣,我得看看,我會想出一些結果。 – 2012-03-12 01:38:40

+0

似乎工作得非常好,謝謝,我使用遍歷目前在一個項目上,因爲我使用zodb,它感覺喜歡它真的是唯一合乎邏輯的方式來做到這一點。我有其他的項目,目前定義了自己的路線,但我相信我可以通過遍歷獲得相同的結果。來自塔架我真的習慣了路線,並被遍歷的背後的魔力嚇到了 – 2012-03-14 23:34:46

+0

我仍然只有一個問題,當你說編輯註冊表不是線程安全的。你的意思是,如果兩個人正在編輯註冊表,它會失敗或不幸的是有一些意想不到的結果。 將不得不看看它是如何完成的,但我看到兩種可能性。配置程序複製配置,然後將其推送到註冊表並完全覆蓋它。或者只推送新的或修改的配置。我的猜測是覆蓋。所以如果有人在編輯時進行編輯。這些更改可能永遠不會保存。我現在認爲這不是一件大事,但要記住好。 – 2012-03-14 23:36:37