2017-03-14 2 views
-1

Ich bereite die Bereitstellung einer kleinen Flask-App vor, die ich für den internen Gebrauch entwickelt habe. Ich habe einen alten Laptop mit Ubuntu Server 16.04, uWSGI und Nginx, den ich für die Bereitstellung verwenden werde.Soll instance/config.py beim Bereitstellen einer Flask-App auf den Produktionsserver hochgeladen werden?

OPTION 1

Meine aktuelle App-Setup hat eine instance/config.py Datei, die ich aus der Versionskontrolle gehalten haben. Diese Datei enthält die folgenden:

SECRET_KEY = ... 
SQLALCHEMY_DATABASE_URI = ... 

# Google 'client_id' and 'client_secret' for social authentication functionality. 

Die instance/config.py-Datei geladen wird wie folgt in app/__init__.py:

def create_app(config_name): 
    app = Flask(__name__, instance_relative_config=true) 
    app.config.from_object(app_config[config_name]) 
    app.config.from_pyfile('config.py') 

Ist es sicher, das gleiche Setup für die Produktion zu halten und so haben die instance/config.py Datei in der Produktion Server?

OPTION 2

Alternativ sollte ich mit Umgebungsvariablen werden? Wenn dies der Fall wäre, würde ich etwas tun, wie so in wsgi.py:

os.environ['FLASK_CONFIG'] = 'production' 
os.environ['SECRET_KEY'] = ... 
os.environ['SQL_ALCHEMY_DATABASE_URI'] = ... 

und habe dann folgend in app/__init__.py:

def create_app(config_name): 
    if os.getenv('FLASK_CONFIG') == 'production': 
    app = Flask(__name__) 
    app.config.update(
     SECRET_KEY=os.getenv('SECRET_KEY') 
     SQLALCHEMY_DATABASE_URI=os.getenv('SQLALCHEMY_DATABASE_URI') 
    ) 
    else: 
    app = Flask(__name__, instance_relative_config=true) 
    app.config.from_object(app_config[config_name]) 
    app.config.from_pyfile('config.py') 
+0

Die Produktion ist eine andere Instanz als dev, daher sollte sie andere Instanzeinstellungen haben. – davidism

+0

Ich bin mir nicht sicher, was du meinst. Ich weiß, 'SQLALCHEMY_DATABASE_URI' wird sich von dem unterscheiden, den ich in der Entwicklung verwende, aber sagst du, dass ich auch einen anderen' SECRET_KEY' verwenden soll?Aber meine Frage bleibt: ** Ist es sicher, "instance/config.py" auf dem Produktionsserver zu haben? ** Bitte beachten Sie, dass ich in meinem Fall auch eine '/ config.py' Datei habe, in der ich andere Einstellungen behalte (zB 'DEBUG = False' für die Produktion, etc.) –

+1

Warum ist die Existenz einer Konfigurationsdatei in der Produktion unsicher? Auch nicht sicher, warum Sie Instanz-Konfiguration haben und separat etwas anderes namens Config für verschiedene Konfigurationen haben. Klingt so, als würden Sie Dinge für sich selbst verwirrend machen. Die Antwort läuft auf "Konfigurieren, was Sie konfigurieren müssen". Sie können das jedoch für Ihre Bereitstellung tun. – davidism

Antwort

0

die Frage zu beantworten, ja, es so lange wie der Server sicher ist ist sicher. Hoffentlich ist der Zugriff nur mit einem privaten Schlüssel erlaubt. Wenn Sie sich mit einem Passwort anmelden, kann das ein Problem sein.

Es ist eine gute Idee, die tatsächliche Datei zum Laden der Konfiguration außerhalb der Versionskontrolle zu behalten. Ich habe tatsächlich einen Fehler mit einem meiner Server gemacht, wo ich config.py in Versionskontrolle gesetzt habe und jetzt muss ich vorsichtig sein, jedes Mal wenn ich ziehe, überschreibe die Datei nicht.

Eine Sache, die Sie tun können, ist eine Konfigurationsdatei für jede Umgebung haben, sagen prod.py und dev.py, die in beiden geprüft. Dann eine pointer.py erstellen, die nicht in die Versionskontrolle aktiviert ist.

prod.py

SECRET_KEY = ... 
SQLALCHEMY_DATABASE_URI = ... 
... 

pointer.py

from prod import SECRET_KEY, SQLALCHEMY_DATABASE_URI, ... 

server.py

app.config.from_pyfile('pointer.py') 

In dev, einfach das ändern Importanweisung, um auf dev.py zu verweisen. Sie könnten auch from prod import * tun, aber das isn't very good practice.

Verwandte Themen