python - theme - Создание проекта Flask-Admin во время тестирования



flask-admin примеры (2)

У меня возникли проблемы с созданием чертежей Flask-Admin, когда я тестирую свое приложение.

Это мой класс вида (с использованием SQLAlchemy)

##
# All views that only admins are allowed to see should inherit from this class.
#
class AuthView(ModelView):
    def is_accessible(self):
        return current_user.is_admin()

class UserView(AuthView):
    column_list = ('name', 'email', 'role_code')

Вот как я инициализирую представления:

# flask-admin
admin.add_view(UserView(User, db.session))
admin.init_app(app)

Однако, когда я пытаюсь запустить больше одного теста (ошибка всегда возникает во втором тесте и во всех остальных тестах), я всегда получаю следующее сообщение об ошибке:

======================================================================
ERROR: test_send_email (tests.test_views.TestUser)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/lib/python2.7/site-packages/nose/case.py", line 133, in run
    self.runTest(result)
  File "/lib/python2.7/site-packages/nose/case.py", line 151, in runTest
    test(result)
  File "/lib/python2.7/site-packages/flask_testing.py", line 72, in __call__
    self._pre_setup()
  File "/lib/python2.7/site-packages/flask_testing.py", line 80, in _pre_setup
    self.app = self.create_app()
  File "/tests/test_init.py", line 27, in create_app
    app = create_app(TestConfig)
  File "/fbone/app.py", line 41, in create_app
    configure_extensions(app)
  File "/fbone/app.py", line 98, in configure_extensions
    admin.add_view(UserView(User, db.session))
  File "/lib/python2.7/site-packages/flask_admin/base.py", line 484, in add_view
    self.app.register_blueprint(view.create_blueprint(self))
  File "/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
    return f(self, *args, **kwargs)
  File "/lib/python2.7/site-packages/flask/app.py", line 885, in register_blueprint
    (blueprint, self.blueprints[blueprint.name], blueprint.name)
AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x110576910> and <flask.blueprints.Blueprint object at 0x1103bd3d0>.  Both share the same name "userview".  Blueprints that are created on the fly need unique names.

Странно то, что это происходит только во втором тесте, и никогда, когда я просто запускаю приложение.

Когда я отлаживал тесты, первый раз он сделал именно то, что я ожидал, и добавил проект в приложение после init_app (app). Во второй раз, однако, процесс сразу же прекратился при достижении шага add_view (что, я думаю, странно, потому что чертежи регистрируются в вызове init_app (приложение)?)


Answer #1

Я должен был добавить следующее к моему тестовому случаю tearDown. Он очищает представления, добавленные в расширение администратора в тестовой настройке

from flask.ext.testing import TestCase
from flask.ext.admin import BaseView

# My application wide instance of the Admin manager
from myapp.extensions import admin 


class TestView(BaseView):
    ...


class MyTestCase(TestCase):
    def setUp(self):
        admin.add_view(TestView())

    def tearDown(self):
       admin._views.pop(-1)
       admin._menu.pop(-1)

Это, конечно, немного взломать, но он выполнил эту работу, пока у меня возникла эта проблема.


Answer #2

То же самое случилось со мной при использовании Flask-Admin и тестирования с помощью pytest. Я смог исправить это, не создавая функции разрыва для моих тестов, перемещая создание экземпляра администратора на фабрику приложений.

До:

# extensions.py
from flask.ext.admin import Admin
admin = Admin()

# __init__.py
from .extensions import admin

def create_app():
    app = Flask('flask_app')

    admin.add_view(sqla.ModelView(models.User, db.session))
    admin.init_app(app)

    return app

После:

# __init__.py
from flask.ext.admin import Admin

def create_app():
    app = Flask('flask_app')

    admin = Admin()

    admin.add_view(sqla.ModelView(models.User, db.session))    
    admin.init_app(app)

    return app

Поскольку pytest запускает фабрику приложений каждый раз, когда она больше не пытается зарегистрировать несколько просмотров в глобальном экземпляре администратора. Это не соответствует типичному использованию расширения флэшей, но оно работает, и это заставит вашу фабрику приложений наткнуться на представления Flask-Admin.





flask-admin