Ich schreibe eine Flasche Website und ich bin mir nicht sicher, welche Dateien sollen meine Lauf, konfigurieren und Setup-Code enthalten. Meine Verzeichnisstruktur sieht wie folgt aus:Flask: brauche Klärung bei run, config, und Setup-Layout
/
dev_settings.py
run.py
various other files... (schema, production_settings, etc)
/sitename
__init__.py
various other files... (routes, models, etc)
Und der Inhalt dev_settings.py, run.py und __init__.py sind unten. Mein Verständnis davon ist wie folgt:
- run.py ist der Einstiegspunkt.
- Er ruft ein App-Objekt aus sitename/__ init__.py und importiert die Konfigurationseinstellungen aus dev_settings (oder production_settings).
- Irgendwann wird der (restliche) Setup-Code in __init__.py ausgeführt? Dies ist der Code in-between "app = Flask (__ name__)" und "Import sitename.admin_routes"
ich aber nicht alle benutzerdefinierten Konfigurationsvariablen aus __init__.py (zB zugreifen können, indem sie versuchen, „print app.config ['stuff from dev_settings'] ") und jetzt habe ich ein Problem, weil ich Dateien hochladen möchte und ich kann kein UploadSet erstellen und konfigurieren, ohne UPLOADED_IMAGES_DEST, das ich in dev_settings.py gesetzt habe
Wohin gehe ich hier falsch? Warum ist run.py app.config nirgendwo anders sichtbar? Muss ich run.py und __init__.py unbedingt verdichten? Ich bevorzuge es, sie zu trennen.
dev_settings.py
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
#dev_settings.py
import os
from flask.ext.uploads import IMAGES
basedir = os.path.abspath(os.path.dirname(__file__))
DEBUG = True
TESTING = False
SECRET_KEY = 'SECRET'
DATABASE = 'dev.db'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, DATABASE)
UPLOADED_IMAGES_DEST = 'site/images/'
UPLOADED_IMAGES_ALLOW = IMAGES
UPLOADED_IMAGES_URL = 'images/'
run.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# run.py
from flask import Flask
import socket
from sitename import app
if __name__ == '__main__':
if socket.gethostname() == 'dev_laptop':
app.config.from_object('dev_settings')
else:
app.config.from_object('prod_settings')
app.run()
__init__.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __init__.py
from flask import Flask
from flask.ext.login import LoginManager
from flask_wtf.csrf import CsrfProtect
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.bcrypt import Bcrypt
app = Flask(__name__)
login_manager = LoginManager()
login_manager.init_app(app)
CsrfProtect(app)
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
import sitename.admin_routes
Beim Importieren 'Site-Name/__ init __. Py', führt sie vollständig vor' run.py' Ausführung wieder aufnimmt. Das bedeutet, dass die Konfiguration eingestellt wird, nachdem Sie Ihre Erweiterungen initialisiert haben. – dirn
Wenn ich einige der Setup-Zeilen verschieben würde, sagen wir "db = SQLAlchemy (app)" in run.py, wie würde ich auf diese Variable innerhalb des Hauptprojekts zugreifen? Ich wäre nicht mehr in der Lage, "aus sitename import db" auszuführen. Gibt es eine andere Möglichkeit, es zu importieren? – thekthuser
Sie können sich einige der [allgemeinen Anwendungslayouts] (http://stackoverflow.com/a/14421367/978961) ansehen. – dirn