在中间件中访问 django 模型 (django>1.7)

Accessing a django model in middleware (django>1.7)

我正在从 django 1.6.5 升级到 django 1.9,并在此过程中升级了几个中间件 类。其中一些中间件 类 在 process_requestprocess_response 阶段使用模型。但是,我在尝试使用它们时遇到 AppRegistryNotReady: Apps aren't loaded yet. 错误。

有没有办法在中间件中导入模型?
我应该将导入语句移到 process_request / process_response 方法中吗?

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/newrelic-2.50.0.39/newrelic/api/web_transaction.py", line 1329, in _nr_wsgi_application_wrapper_
    result = wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/newrelic-2.50.0.39/newrelic/api/web_transaction.py", line 1329, in _nr_wsgi_application_wrapper_
    result = wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 158, in __call__
    self.load_middleware()
  File "/usr/local/lib/python2.7/dist-packages/newrelic-2.50.0.39/newrelic/common/object_wrapper.py", line 302, in _wrapper
    result = wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 51, in load_middleware
    mw_class = import_string(middleware_path)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/module_loading.py", line 20, in import_string
    module = import_module(module_path)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/web/MyJobs/MyJobs/apache/../middleware.py", line 9, in <module>
    from django.contrib.sites.models import Site
  File "/usr/local/lib/python2.7/dist-packages/django/contrib/sites/models.py", line 83, in <module>
    class Site(models.Model):
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 94, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 239, in get_containing_app_config
    self.check_apps_ready()
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
AppRegistryNotReady: Apps aren't loaded yet.

您需要使用新的 API 来获取 WSGI 处理程序:

from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

这将为您调用 django.setup(),这将填充应用注册表。