2014-10-22 2 views
1

Я занимаюсь этим несколько часов, но я боюсь, что я все еще не использую контекст приложения gronk и как мое приложение должно быть реализовано с помощью Blueprints.Флакон Чертежи: RuntimeError Приложение не зарегистрировано в db

Ive посмотрел на this и this и попробовал несколько разных рекомендаций, но в моем базовом подходе должно быть что-то не так.

У меня есть один 'главный' настройки Blueprint по следующей структуре: PJ

project/ 
    app/ 
     main/ 
      __init__.py 
      routes.py 
      forms.py 
      helper.py 
     admin/ 
     static/ 
     templates/ 
     __init__.py 
     models.py 

приложение/инициализации .py:

from flask import Flask 
from config import config 

from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.bootstrap import Bootstrap 

db = SQLAlchemy() 
bootstrap = Bootstrap() 


def create_app(config_version='default'): 
    app = Flask(__name__) 
    app.config.from_object(config[config_version]) 
    bootstrap.init_app(app) 
    from .main import main as main_blueprint 
    app.register_blueprint(main_blueprint) 

    db.init_app(app) 

    return app 

приложение/главная/инициализации .py

from flask import Blueprint 
main = Blueprint('main',__name__) 

from . import routes, helper 

приложение/главная/helper.py

#!/usr/bin/env python 
from . import main 
from ..models import SKU, Category, db 
from flask import current_app 


def get_categories(): 
    cat_list = [] 
    for cat in db.session.query(Category).all(): 
     cat_list.append((cat.id,cat.category)) 
    return cat_list 

Все работало отлично, пока я создал функцию get_categories в helpers.py тянуть динамический список для выбора формы в приложение/основной/forms.py. Когда я fireup WSGI, однако, я получаю эту ошибку:

RuntimeError: application not registered on db instance and no application bound to current context 

Было бы появиться db ссылки в помощнике не связан с контекстом приложения, но когда я пытаюсь создать внутри функции, он не работал.

Что я делаю неправильно, и есть ли лучший способ организовать вспомогательные функции при использовании чертежей?

+0

В файле помощника, почему db импортируется из моделей .models? Вы не показываете этот файл здесь, поэтому я не знаю, как он выглядит. – Gohn67

ответ

2

Documentation on database contexts here here.

Моя первая мысль заключалась в том, что вы не звонили db.init_app(app), но были исправлены в комментариях.

В app/main/helper.py вы импортируете базу данных через from ..models import SKU, Category, db. Этот объект базы данных не будет инициализирован приложением, которое вы создали.

Способ, которым я обходился, заключается в следующем файле: shared.py в корневом каталоге. В этом файле, создать объект базы данных,

from flask.ext.sqlalchemy import SQLAlchemy 
db = SQLAlchemy() 

в вашем app/init.py, не создать новый объект db. Вместо этого сделать

from shared import db 
db.init_app(app) 

В любом месте, которое вы хотите использовать db объект, импортировать его из shared.py. Таким образом, объект в общем файле будет инициализирован контекстом приложения, и нет возможности циклического импорта (что является одной из проблем, с которыми вы можете столкнуться, имея объект db вне файла создания приложения) ,

+0

У него есть эта строка в файле 'app.init.py'. Это правильное место? – Gohn67

+0

@ Gohn67 Хороший улов, спасибо. – Celeo

+1

Хороший ответ.Вот как я научился это делать. – Gohn67

Смежные вопросы