2016-10-10 3 views
0

Ich möchte Python Flask aus der Konfigurationsdatei den Speicherort der SQLite3-Datenbank Name lesen, ohne explizit Datenbank-Name schreiben. Die verwendeten Vorlagen sind: http://flask.pocoo.org/docs/0.11/patterns/sqlite3/ und .Flask Blueprint kann nicht lesen sqlite3 DATENBANKEN aus der Konfigurationsdatei

Wenn ich versuche, 'Datenbank' aus meiner Config-Datei zu lesen, bekomme ich folgende Fehlermeldung:

Datei "/ app/my_cool_app/app/init Py", Linie 42, in before_request g db = connect_db()

Datei "/ app/my_cool_app/app/init Py", Zeile 36, in connect_db return sqlite3.connect (my_cool_app.config [ 'DATABASE'])

AttributeError: 'Blueprint' Objekt hat kein Attribut ‚config‘

Hier ist mein init Py Code, wenn ich versuche, aus der Konfigurationsdatei zu lesen und die obige Fehlermeldung erhalten:

import sqlite3 
from flask import Flask, g 
from .views import my_cool_app 

# create application 
def create_app(debug=True): 
    app = Flask(__name__, instance_relative_config=True) 
    app.debug = debug 
    app.config.from_object('config') 
    app.config.from_pyfile('config.py') 
    app.register_blueprint(my_cool_app) 
    return app 

def connect_db(): 
    return sqlite3.connect(my_cool_app.config['DATABASE']) <= LINE 36 

@my_cool_app.before_request 
def before_request(): 
    g.db = connect_db() 

@my_cool_app.teardown_request 
def teardown_request(exception): 
    db = getattr(g, 'db', None) 
    if db is not None: 
     db.close() 

Hier mein run.py ist (I don‘ t es aus):

from app import create_app 
app = create_app() 

Hier ist mein init Py-Code, der funktioniert, wenn ich DB Name explizit schreiben (nicht das, was ich will):

import sqlite3 
from flask import Flask, g 
from .views import my_cool_app 
DATABASE='/app/myappname/my_sqlite3_database_name.db' 

# create application 
def create_app(debug=True): 
    app = Flask(__name__, instance_relative_config=True) 
    app.debug = debug 
    app.config.from_object('config') 
    app.config.from_pyfile('config.py') 
    app.register_blueprint(my_cool_app) 
    return app 

def connect_db(): 
    return sqlite3.connect(DATABASE) 

Antwort

1

Ihr my_cool_app ist eine Instanz von Blueprint, die kein config-Attribut aufweist. Sie müssen current_app verwenden:

import sqlite3 
from flask import Flask, g, current_app 
from .views import my_cool_app 

# create application 
def create_app(debug=True): 
    app = Flask(__name__, instance_relative_config=True) 
    app.debug = debug 
    app.config.from_object('config') 
    app.config.from_pyfile('config.py') 
    app.register_blueprint(my_cool_app) 
    return app 

def connect_db(): 
    return sqlite3.connect(current_app.config['DATABASE']) 

@my_cool_app.before_request 
def before_request(): 
    g.db = connect_db() 

@my_cool_app.teardown_request 
def teardown_request(exception): 
    db = getattr(g, 'db', None) 
    if db is not None: 
     db.close() 
+0

Vielen Dank Phillip Tzou! Ja, ich habe die current_app importiert und funktioniert jetzt wie erwartet. – user1356863

Verwandte Themen