2016-04-18 16 views
0

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 
+0

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

+0

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

+0

Sie können sich einige der [allgemeinen Anwendungslayouts] (http://stackoverflow.com/a/14421367/978961) ansehen. – dirn

Antwort

0

Meine ursprüngliche Problem ergab sich aus nicht vollständig das Verständnis der 'Größere Anwendungen' Seite verlinkt sind aus die Seite dir verlinkt (http://flask.pocoo.org/docs/0.10/patterns/packages/). Die Lösung ist run.py importieren app, app.run() und sonst nichts aufrufen. Mein aktualisierter Code ist unten.

run.py

#!/usr/bin/env python                     
# -*- coding: utf-8 -*-                    
# run.py                        

from sitename import app                     

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 
import socket 

app = Flask(__name__) 

#if __name__ == '__main__': 
if socket.gethostname() == 'dev_laptop': 
    app.config.from_object('dev_settings') 
else: 
    app.config.from_object('prod_settings') 

login_manager = LoginManager() 
login_manager.init_app(app) 
CsrfProtect(app) 
db = SQLAlchemy(app) 
bcrypt = Bcrypt(app) 
configure_uploads(app, images) 

import sitename.admin_routes