2013-07-16 70 views
2

我想延長這大致使用此代碼的應用程序:替代物燒瓶config.from_pyfile

app = Flask('app') 
app.config.from_pyfile('default_config.py') 
app.config.from_pyfile('local_config.py', silent=True) 

在那裏,設置可以使用app.config['value']被訪問。 在我的擴展中,我只想使用配置文件,沒有Flask應用程序,也沒有創建Flask對象。

我唯一的想法是:

import default_config as dc 
import config as cc 

vars_dc = [var for var in dir(dc) if not var.startswith('__')] 
settings = {var: getattr(dc, var) for var in vars_dc} 
vars_cc = [var for var in dir(cc) if not var.startswith('__')] 
settings.update({var: getattr(cc, var) for var in vars_cc}) 

似乎這不是一個很好的解決方案,因爲有很多陷阱,以考慮(在配置文件等錯誤,因此,我將不得不重新實現所有異常處理和東西)

是否有任何模塊具有這樣的功能實現?

*編輯*

#default_config.py 
HOST = 'myhostname' 
PORT = 7453 
DEBUG = False 
MY_URLS = [] 

回答

1

是什麼阻止你做the same way Flask does it

+0

我寧可不復制任何現有的源代碼(或編寫一個新的解決方案)如果有任何其他的,因爲這將讓我自己的模塊混淆(加載配置文件似乎是基本的功能,所以任何人閱讀我的源代碼會肯定問自己,爲什麼我要重新實現它)。 由於'from py_file'是一個類函數,我需要創建一個類實例以從flask模塊重用它,我也不想這樣做。我沒有看到有任何其他方式可以在不重新實現的情況下重用它 – ProfHase85

+0

因此,您不想複製現有的源代碼,並且您不想自己編寫代碼?爲什麼不只是'import default_config'並使用'default_config.HOST'等來訪問你的變量? –

+0

好的複製現有代碼將意味着冗餘,這將是一種糟糕的風格。 我無法訪問'default_config.HOST'等我的變量,因爲有可能也可能不是'config'文件,它可以但不需要覆蓋任何設置 – ProfHase85

1

我不知道如果我理解正確的,但如果你在談論你的擴展代碼使用的配置,您可以根據您的__init__定義爲直接,只要使用它:

class MyExtension(object): 

def __init__(self, app=None): 
    self.app = app 
    if app is not None: 
     self.init_app(app) 

def init_app(self, app): 
    # now you can use app.config 
    app.config.get('HOST') 
+0

問題是,在這種情況下,我需要一個'Flask(app)'對象。我不想初始化一個全新的對象,我只是想將設置文件中的設置讀入字典 – ProfHase85

+1

,您不需要Flask(app)對象。您在這些方法中將「應用程序」作爲參數傳遞。您在實際應用程序中只應用一次app = Flask(__ name__),而不是擴展代碼。看到這個例子https://github.com/maxcountryman/flask-bcrypt/blob/master/flask_bcrypt.py – codegeek

+0

謝謝:)。事實上,我不想擁有一個Flask應用程序。 我正在擴展的應用程序使用flask來提供呈現的html。我想擴展它的功能,它將html自動導出到一個文件,因此我不需要啓動一個燒瓶應用程序。你可能會認爲整個應用程序分爲兩部分:第一部分是渲染html並用燒瓶提供服務的部分,第二部分渲染它並寫入文件或stdout。我只想讓這兩個部分共享這些屬性,並且不影響彼此地共同工作 – ProfHase85

1

晚答案,但我相信這應該工作:

from importlib import import_module 

app.config = import_module("default_config").__dict__