2016-04-27 6 views
0

Ich habe eine App wie folgt aus:Verwendung db ohne dass app.app_context() - Flask

myapp/app/init Py:

import sqlite3 
from contextlib import closing 

from flask import Flask, g 
from flask_sqlalchemy import SQLAlchemy 
from flask_login import LoginManager 

# from app.models import db 
from database import db 

application = Flask(__name__) 
application.config.from_object('config') 
application.debug = True 

db.init_app(application) 

login_manager = LoginManager() 
login_manager.init_app(application) 

from app import views 

myapp/database.py:

from flask_sqlalchemy import SQLAlchemy 

db = SQLAlchemy() 

myapp/app/models.py:

from database import db 
from app import application 


class CRUDMixin(object): 

    ... 

    def delete(self, commit=True): 
     """Remove the record from the database.""" 
     with application.app_context(): 
      db.session.delete(self) 
      return commit and db.session.commit() 


class Model(CRUDMixin, db.Model): 
    """Base model class that includes CRUD convenience methods.""" 
    __abstract__ = True 

    def __init__(self, **kwargs): 
     db.Model.__init__(self, **kwargs) 


class User(Model): 
    """ 
    :param str email: email address of user 
    :param str password: encrypted password for the user 
    """ 
    __tablename__ = 'users' 

    email = db.Column(db.String, primary_key=True) 
    password = db.Column(db.String) 
    authenticated = db.Column(db.Boolean, default=False) 

    def is_active(self): 
     """True, as all users are active.""" 
     return True 

    def get_id(self): 
     """Return the email address to satisfy Flask-Login's requirements.""" 
     return self.email 

    def is_authenticated(self): 
     """Return True if the user is authenticated.""" 
     return self.authenticated 

    def is_anonymous(self): 
     """False, as anonymous users aren't supported.""" 
     return False 

Das Projekt, das ich versuchte zu strukturieren, benötigte with application.app_context() in der Model Helferklasse nicht. Ich kann keine signifikanten Unterschiede zwischen meinem Setup und seiner sehen, und doch ohne with application.app_context() alles über alles im Zusammenhang mit db Ich bekomme die üblichen application not registered on db Fehler. Wenn alles in app/models.py und database.py in app/__init__.py war, funktionierte es ohne Notwendigkeit with application.app_context() und ich konnte db roh in der Schale wie from myapp.app import db importieren und es funktionierte wie es ist. Was kann ich tun, um die application not registered on db Beschwerde zu beruhigen, aber db einfach ohne app_context verwenden zu können, aber immer noch eine ordnungsgemäße Verzeichnisstruktur, in der alles nicht in init gestaut ist? Danke

Antwort

0

Flask-Script gibt Ihnen eine shell.

Wenn Sie ohne Flask-Script arbeiten möchten, müssen Sie den Anwendungskontext festlegen. Eine normale Python-Shell weiß nicht, wie man den Kontext einrichtet.

Es ist einfach, die Shell Flask-Script nachzuahmen.

erstellen shell.py Datei:

from app import application 
ctx = application.app_context() 
ctx.push() 

Run mit python -i und verwenden db mit Ihrer App Kontext bereits definiert:

$ python -i shell.py 
>>> from app import db 
>>> db.create_all()