2015-06-15 3 views
1

Так я форма определяется следующим образом:«Ошибка: работа вне контекста приложения» при попытке создать экземпляр объекта WTForms ввиду Колба

class NewDashForm(Form): 
    tabname = StringField('tabname', validators=[DataRequired(),Length(1,16)]) 
    title = StringField('title', validators=[DataRequired(),Length(1,128)]) 

И я импортировать его в моем views.py файла, но когда я пытаюсь создать его таким образом:

form = NewDashForm() 

Я получаю сообщение об ошибке «Работа вне контекста приложения». Приложение создается с помощью метода «фабрики», как это:

def generate_application(config=None): 
    application = Flask(__name__) 
    application.config.from_object(config) 
    application.register_blueprint(cheda.generate_blueprint(application.config,application.db)) 
    return application 

Существует несколько связанных дб материал, который я оставил в этом последнем фрагменте кода, но вы получите идею. По моему мнению, все, что происходит изнутри представления, должно автоматически находиться в контексте приложения, но, очевидно, я что-то пропускаю. Что я здесь делаю неправильно?

Traceback (most recent call last): 
    File "/vagrant/venv/cheda_env/bin/cheda-run", line 9, in <module> 
    load_entry_point('cheda==0.1.0', 'console_scripts', 'cheda-run')() 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/pkg_resources/__init__.py", line 546, in load_entry_point 
    return get_distribution(dist).load_entry_point(group, name) 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2666, in load_entry_point 
    return ep.load() 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2339, in load 
    return self.resolve() 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/pkg_resources/__init__.py", line 2345, in resolve 
    module = __import__(self.module_name, fromlist=['__name__'], level=0) 
    File "/code/cheda/cheda/cmd/run.py", line 10, in <module> 
    from .. import application 
    File "/code/cheda/cheda/application.py", line 16, in <module> 
    from .blueprints import cheda 
    File "/code/cheda/cheda/blueprints/cheda.py", line 10, in <module> 
    from ..views import views as cheda_views 
    File "/code/cheda/cheda/views/views.py", line 37, in <module> 
    class NewDash(JsonApiView): 
    File "/code/cheda/cheda/views/views.py", line 39, in NewDash 
    form = NewDashForm() 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/wtforms/form.py", line 212, in __call__ 
    return type.__call__(cls, *args, **kwargs) 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/flask_wtf/form.py", line 68, in __init__ 
    csrf_enabled = current_app.config.get('WTF_CSRF_ENABLED', True) 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/werkzeug/local.py", line 338, in __getattr__ 
    return getattr(self._get_current_object(), name) 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/werkzeug/local.py", line 297, in _get_current_object 
    return self.__local() 
    File "/vagrant/venv/cheda_env/lib/python3.4/site-packages/flask/globals.py", line 34, in _find_app 
    raise RuntimeError('working outside of application context') 
RuntimeError: working outside of application context 

ответ

3

Вы должны создавать экземпляры только в виде fuctions, делая это вне запроса, не имеет смысла. Вы получаете ошибку, потому что она пытается получить данные из запроса, которого нет.

Если у вас есть действительно необходимо создать экземпляр перед раздачей, либо передать пустые данные, чтобы он не смотрел запрос или не использовал контекст запроса.

from werkzeug.datastructrues import MultiDict 
form = MyForm(MultiDict()) 

# or 

with app.test_request_context(): 
    form = MyForm() 

Опять же, вы никогда не должны делать это в своем приложении, форма полезна только внутри представления во время запроса. Контекст тестового запроса полезен, если вы хотите протестировать форму в модульном тесте.

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

  • Нет связанных вопросов^_^