Pytest-django: django_db рдЪрд┐рд╣реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рд╕рд┐рддре░ 2016  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytest-dev/pytest-django

рдореИрдВ рдЕрдкрдиреЗ Django рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рдЖрдзрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ pytest рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдбрд╛рд▓

import pytest
pytestmark = pytest.mark.django_db

рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдХреЗ рдЕрдВрддрд┐рдо рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЬреЛ рдореЗрд░реЗ рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (lib/frontend/decorators.py)
рдЗрд╕реЗ рдХрдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖред рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдкрд░ рдореЗрд░реЗ рд╕рднреА рдЪрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рднреА рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реАред

рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ pytest-django рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ?

vagrant@vagrant-ubuntu-trusty-64:/vagrant$ pytest 
== test session starts ==
platform linux2 -- Python 2.7.6, pytest-3.0.2, py-1.4.31, pluggy-0.3.1
Django settings: patient.settings (from ini file)
rootdir: /vagrant, inifile: pytest.ini
plugins: django-3.0.0, pythonpath-0.7.1
collected 265 items / 2 errors 

[...]

_ ERROR collecting lib/tests/report/testfunc.py _
lib/tests/report/testfunc.py:6: in <module>
    from report.func import generate_report_filename
lib/report/func.py:29: in <module>
    from frontend import chart
lib/frontend/chart.py:294: in <module>
    @pytest.mark.django_db
lib/frontend/decorators.py:20: in decorator
    if Site.objects.get_current().id in (allowed_site_ids):
/usr/local/lib/python2.7/dist-packages/django/contrib/sites/models.py:60: in get_current
    return self._get_site_by_id(site_id)
/usr/local/lib/python2.7/dist-packages/django/contrib/sites/models.py:39: in _get_site_by_id
    site = self.get(pk=site_id)
/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py:127: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
/usr/local/lib/python2.7/dist-packages/django/db/models/query.py:328: in get
    num = len(clone)
/usr/local/lib/python2.7/dist-packages/django/db/models/query.py:144: in __len__
    self._fetch_all()
/usr/local/lib/python2.7/dist-packages/django/db/models/query.py:965: in _fetch_all
    self._result_cache = list(self.iterator())
/usr/local/lib/python2.7/dist-packages/django/db/models/query.py:238: in iterator
    results = compiler.execute_sql()
/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py:838: in execute_sql
    cursor = self.connection.cursor()
/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py:162: in cursor
    cursor = self.make_debug_cursor(self._cursor())
/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py:135: in _cursor
    self.ensure_connection()
E   Failed: Database access not allowed, use the "django_db" mark to enable it.

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡реИрд╕реЗ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдСрдЯреЛрд╕ рдлрд┐рдХреНрд╕реНрдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ

@pytest.fixture(autouse=True)
def enable_db_access(db):
    pass

рдЕрдкрдиреЗ рдореБрдХрд╛рдмрд▓реЗ рдореЗрдВ

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡реИрд╕реЗ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдСрдЯреЛрд╕ рдлрд┐рдХреНрд╕реНрдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ

@pytest.fixture(autouse=True)
def enable_db_access(db):
    pass

рдЕрдкрдиреЗ рдореБрдХрд╛рдмрд▓реЗ рдореЗрдВ

@encore рдХрд╛ рдЬрд╡рд╛рдм рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рднреА рдЬреЛрдбрд╝реЗ рд╣реИрдВ:

http://pytest-django.readthedocs.io/en/latest/faq.html#how -can-i-give-database-access-to-all-my-tests-without-the-django-db-marker

рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЖрдпрд╛рдд рд╕рдордп рдкрд░ рдбреАрдмреА рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред рдореИрдВ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдбреАрдмреА рдПрдХреНрд╕реЗрд╕ рдХреЛ рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░реВрдВ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЧреНрд░рд╣ рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреА рдЬрд╛ рд╕рдХреЗ? рдзрдиреНрдпрд╡рд╛рдж!

@Telofy рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рдбреАрдмреА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдпрд╛рдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ? рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ...

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Django (рдФрд░ pytest-django) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЖрдпрд╛рдд рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИред pytest-django pytests рдлрд┐рдХреНрд╕реНрдЪрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ pytest-django рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗ рдХрд┐ рдлрд┐рдХреНрд╕реНрдЪрд░ рдЖрдпрд╛рдд рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ:
https://github.com/pytest-dev/pytest-django/issues/499#issuecomment -322056315

рдЙрди рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрдиреА рдХреЗ рдкреВрд░реЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдореЗрд░реА рд╢рдХреНрддрд┐ рдпрд╛ рд╕рдордп рдмрдЬрдЯ рдХреЗ рднреАрддрд░ рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди conftest.py рдореЗрдВ рд╕реБрдкрд░ рдмрджрд╕реВрд░рдд рдмрдВрджрд░-рдкреИрдЪрд┐рдВрдЧ рд╣реИ:

from pytest_django.plugin import _blocking_manager
from django.db.backends.base.base import BaseDatabaseWrapper

_blocking_manager.unblock()
_blocking_manager._blocking_wrapper = BaseDatabaseWrapper.ensure_connection

рдореИрдВ рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ( @pytest.mark.django_db рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде) рдлрд┐рд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЧрд▓рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд░рд╣рд╛ рд╣реИ:

def assert_test_db(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        assert connection.settings_dict['NAME'] == 'test_kf_server', connection.settings_dict
        return func(*args, **kwargs)
    return wrapper

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @Telofy - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛!

рдЖрдпрд╛рдд рд╕рдордп рдкрд░ рдбреАрдмреА рдкреНрд░рд╢реНрди рдХрд░реЗрдВ, рди рдХреЗрд╡рд▓ рдЦрд░рд╛рдм рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдпрд╣ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЖрдкрдХрд╛ рд╕рдордп рдЦрд░рд╛рдм рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЖрд▓рд╕реА рддрд░реАрдХреЛрдВ/рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдЬреЛ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗ рдЬрд╛рдиреЗ рддрдХ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдП рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдкрд╛рд╕ рдХрд░рдирд╛ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЧрд┐рдирддреА рдЖрджрд┐ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рдмрдЪрдирд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

koxu1996 picture koxu1996  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

clintonb picture clintonb  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ojake picture ojake  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

aljosa picture aljosa  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

WoLpH picture WoLpH  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ