gunicorn因__init__.py中的导入失败

0 投票
1 回答
989 浏览
提问于 2025-04-18 05:10

我在应用程序的 init.py 文件里有这么一行代码:

from .signals import *

当我运行 gunicorn myproject.wsgi:application 时,出现了这个错误:

Traceback (most recent call last):
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
    worker.init_process()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
    self.wsgi = self.app.wsgi()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
    self.callable = self.load()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
    return self.load_wsgiapp()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
    __import__(module)
  File "/webapps/venv/myproject/myproject/__init__.py", line 1, in <module>
    from .signals import *
  File "/webapps/venv/myproject/myproject/signals.py", line 1, in <module>
    from django.db.models.signals import pre_delete
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/__init__.py", line 5, in <module>
    from django.db.models.query import Q
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 17, in <module>
    from django.db.models.deletion import Collector
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 4, in <module>
    from django.db.models import signals, sql
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/__init__.py", line 4, in <module>
    from django.db.models.sql.subqueries import *
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/subqueries.py", line 12, in <module>
    from django.db.models.sql.query import Query
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 22, in <module>
    from django.db.models.sql import aggregates as base_aggregates_module
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/aggregates.py", line 9, in <module>
    ordinal_aggregate_field = IntegerField()
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 116, in __init__
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
  File "/webapps/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
    self._setup(name)
  File "/webapps/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Traceback (most recent call last):
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
    worker.init_process()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
    self.wsgi = self.app.wsgi()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
    self.callable = self.load()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
    return self.load_wsgiapp()
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/webapps/venv/local/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
    __import__(module)
  File "/webapps/venv/myproject/myproject/__init__.py", line 1, in <module>
    from .signals import *
  File "/webapps/venv/myproject/myproject/signals.py", line 1, in <module>
    from django.db.models.signals import pre_delete
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/__init__.py", line 5, in <module>
    from django.db.models.query import Q
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 17, in <module>
    from django.db.models.deletion import Collector
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 4, in <module>
    from django.db.models import signals, sql
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/__init__.py", line 4, in <module>
    from django.db.models.sql.subqueries import *
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/subqueries.py", line 12, in <module>
    from django.db.models.sql.query import Query
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 22, in <module>
    from django.db.models.sql import aggregates as base_aggregates_module
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/sql/aggregates.py", line 9, in <module>
    ordinal_aggregate_field = IntegerField()
  File "/webapps/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 116, in __init__
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
  File "/webapps/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
    self._setup(name)
  File "/webapps/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

如果我把上面提到的那行代码禁用掉,gunicorn 就能正常工作了。当然,我可以把 import 这一行移动到别的地方来解决这个问题,但我想知道为什么会出现这个错误,还有没有其他方法可以解决它。

1 个回答

0

使用 from .signals import * 这个语句时,似乎是因为执行顺序的问题导致你遇到了错误。

根据关于 DJANGO_SETTINGS_MODULE 的错误提示,你需要先定义这个变量,才能从模型文件中导入内容。我认为出现的问题是,当 gunicorn 尝试加载你的应用时,__init__.py 文件被执行了,但这时 Django 还没有加载完所有的应用设置。

一个可能的解决办法是在你的 signals.py 文件中定义 __all__

不过,没有更多的上下文信息,很难确定具体问题所在。

撰写回答