2013-03-24 28 views
9

tôi đang làm việc trên một ứng dụng mà trông giống nhưBình: Cách quản lý cơ sở dữ liệu môi trường khác nhau?

facebook/ 
     __init__.py 
     feed/ 
      __init__.py 
      business.py 
      views.py 
      models/ 
        persistence.py 
        user.py 
     chat/ 
      __init__.py 
      models.py 
      business.py 
      views.py 
     config/ 
       dev.py 
       test.py 
       prod.py 

Tôi muốn có ba môi trường Dev, TestProduction.
Tôi có các yêu cầu sau:
a.) Khi tôi khởi động máy chủ python runserver.py, tôi muốn đề cập đến môi trường nào tôi muốn kết nối - Dev, Test hoặc Production.
b.) Dev & Production nên có sơ đồ xây dựng và chỉ cần kết nối với máy
c.) Tôi cũng muốn cho thử nghiệm của tôi để kết nối với sqlite db, và tạo ra các sơ đồ, kiểm tra chạy

thế nào có thể Tôi đạt được điều này một cách cấu hình để tôi không phải hardcode bất cứ điều gì liên quan đến cơ sở dữ liệu.

Có mẫu nào có sẵn trong bình không?

Hiện nay runerver.py tôi đã hardcoding cho môi trường mà tôi không thích,

app = Flask(__name__) 
app.config['SECRET_KEY'] = dev.SECRET_KEY 

Tôi đang tìm kiếm những ý tưởng tốt hơn tôi có

+1

bình cung cấp một vài ví dụ để bạn bắt đầu trong tài liệu của họ http://flask.pocoo.org/docs/config/#development-production – dm03514

Trả lời

15

Giải pháp tôi sử dụng:

#__init__.py 
app = Flask(__name__) 
app.config.from_object('settings') 
app.config.from_envvar('MYCOOLAPP_CONFIG',silent=True) 

Trên cùng cấp để từ đó tải ứng dụng:

#settings.py 
SERVER_NAME="dev.app.com" 
DEBUG=True 
SECRET_KEY='xxxxxxxxxx' 


#settings_production.py 
SERVER_NAME="app.com" 
DEBUG=False 

So. Nếu môi trường biến MYCOOLAPP_CONFIG không tồn tại -> chỉ settings.py sẽ tải, đề cập đến cài đặt mặc định (máy chủ phát triển như tôi)
Đây là lý do cho "silent = True", tệp cấu hình thứ hai không cần thiết, trong khi cài đặt .py mặc định cho phát triển và với giá trị mặc định cho các phím cấu hình phổ biến

Nếu bất kỳ settings_file nào khác sẽ được nạp thêm vào một giá trị đầu tiên bên trong, nó sẽ ghi đè giá trị trong giá trị ban đầu.(Trong ví dụ DEBUG và SERVER_NAME của tôi sẽ được overrided, trong khi SECRET_KEY vẫn tương tự cho tất cả các máy chủ)

Điều duy nhất bạn nên khám phá cho chính mình phụ thuộc vào cách làm thế nào bạn khởi động ứng dụng của bạn
Trước khi tung ra ENVVAR MYCOOLAPP_CONFIG nên được đặt
Ví dụ tôi chạy với daemon giám sát và trên máy chủ sản xuất, tôi chỉ cần đặt này trong giám sát tập tin cấu hình:

environment=MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py" 

với cách này bạn có thể dễ dàng quản lý tất cả các file cấu hình của bạn, hơn nữa, với cách này bạn có thể loại trừ các tập tin này từ git hoặc bất kỳ tiện ích kiểm soát phiên bản nào khác

mặc định Linux cách là một trong những này trong giao diện điều khiển trước khi tung ra:
export MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"

+0

cảm ơn! này si một trợ giúp tuyệt vời! – daydreamer

+0

http://flask.pocoo.org/docs/config/#configuring-from-files là một nguồn tốt để biết thêm thông tin về điều này – Eddie

2

Bạn có thể tạo một "cấu hình" mô-đun chứa các cấu hình cho mỗi môi trường. Sau đó môi trường đang chạy có thể được xác định bằng cách thiết lập một biến hệ vỏ.

Nếu bạn đang khởi tạo ứng dụng bình của mình trong tập tin init chính, cấu hình này cũng có thể được đặt ở đó. Đây là cách tôi đặt cấu hình của tôi:

def setup_config(app): 
    """Set the appropriate config based on the environment settings""" 
    settings_map = {'development': DevelopmentSettings, 
        'staging': StagingSettings, 
        'testing': TestingSettings, 
        'production': ProductionSettings} 
    env = environ['ENV'].lower() 
    settings = settings_map[env] 
    app.config.from_object(settings) 

Thiết lập biến môi trường trước khi chạy máy chủ phát triển hoặc thậm chí các bài kiểm tra có thể là một rắc rối, do đó tôi tự động hóa những hành động này với một makefile.

Ngoài ra, hãy xem flask-script http://flask-script.readthedocs.org/en/latest/.

+1

Thumbs up để có môi trường thực tế trong một env var, không phải là tên mô-đun . – linkyndy

6

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm:

http://flask.pocoo.org/docs/config/#configuring-from-files

Nhưng cũng kiểm tra các dự án bình rỗng, đó là một boilerplate cho các ứng dụng bình với cấu hình môi trường cụ thể.

https://github.com/italomaia/flask-empty

Bạn chỉ rõ cấu hình của bạn trong config.py như vậy:

class Dev(Config): 
    DEBUG = True 
    MAIL_DEBUG = True 
    SQLALCHEMY_ECHO = True 
    SQLALCHEMY_DATABASE_URI = "sqlite:////tmp/%s_dev.sqlite" % project_name 

này kế thừa lớp Config có thể chứa giá trị mặc định của bạn. Từ đó, main.py có các phương thức để tạo một cá thể bình từ tệp config.py, manage.py xác định cấu hình nào được nạp.

Dưới đây là một đoạn trích từ main.py để bạn có được ý tưởng:

def app_factory(config, app_name=None, blueprints=None): 
    app_name = app_name or __name__ 
    app = Flask(app_name) 

    config = config_str_to_obj(config) 
    configure_app(app, config) 
    configure_blueprints(app, blueprints or config.BLUEPRINTS) 
    configure_error_handlers(app) 
    configure_database(app) 
    configure_views(app) 

    return app 

Và sau đó manage.py xử lý thiết lập môi trường dựa trên đối số dòng lệnh được thông qua, tuy nhiên bạn có thể nhận được một ý tưởng về nó như thế nào công trình (lưu ý điều này yêu cầu bình đựng chữ):

from flask.ext import script 

import commands 

if __name__ == "__main__": 
    from main import app_factory 
    import config 

    manager = script.Manager(app_factory) 
    manager.add_option("-c", "--config", dest="config", required=False, default=config.Dev) 
    manager.add_command("test", commands.Test()) 
    manager.run() 

Từ đây bạn có thể chọn lớp Config yêu cầu từ biến môi trường hoặc phương pháp bạn chọn.

2

Bình có thứ gọi là Instance folders, có thể có các cấu hình khác nhau và tải chúng tương ứng.

Các vấn đề liên quan