首页 > 解决方案 > django-configurations 在使用 uwsgi 时找不到我的配置

问题描述

我正在尝试将Django==2.1项目从一个 AWS 实例迁移到另一个。我没有创建项目,所以我不确定他们部署的所有步骤。我看到它uWSGI==2.0.19.1在 requirements.txt 文件中,所以我试图用它在端口 8000 上运行项目。

该项目还使用该库django-configurations==2.1来管理多个配置。它们位于config使用此结构调用的文件夹中。

project/
  config/
    __init__.py
    common.py
    development.py
    local.py
    production.py
    staging.py
  manage.py
  wsgi.py
  ...

config文件夹中的__init__.py文件包含以下内容:

from __future__ import absolute_import

from .local import Local
from .staging import Staging
from .production import Production
from .development import Development

我正在尝试运行以下命令:
uwsgi --http :8000 --module wsgi:application --chdir=/path/to/project
我收到此错误:

Traceback (most recent call last):
  File "./wsgi.py", line 16, in <module>
    from configurations.wsgi import get_wsgi_application
  File "/path/to/project/.env/lib/python3.6/site-packages/configurations/wsgi.py", line 14, in <module>
    application = get_wsgi_application()
  File "/path/to/project/.env/lib/python3.6/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
    django.setup(set_prefix=False)
  File "/path/to/project/.env/lib/python3.6/site-packages/django/__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/path/to/project/.env/lib/python3.6/site-packages/django/conf/__init__.py", line 57, in __getattr__
    self._setup(name)
  File "/path/to/project/.env/lib/python3.6/site-packages/django/conf/__init__.py", line 44, in _setup
    self._wrapped = Settings(settings_module)
  File "/path/to/project/.env/lib/python3.6/site-packages/django/conf/__init__.py", line 107, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/path/to/project/.env/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 656, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible
  File "/path/to/project/.env/lib/python3.6/site-packages/configurations/importer.py", line 163, in load_module
    mod.__package__))
  File "/path/to/project/.env/lib/python3.6/site-packages/configurations/importer.py", line 159, in load_module
    cls = getattr(mod, self.name)
AttributeError: Couldn't find configuration 'Production
' in module 'config':  module 'config' has no attribute 'Production
' 
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 20490, cores: 1)

所以这似乎是 django-configurations 的一个问题,但如果我只是用DJANGO_CONFIGURATION=Production manage.py runserver 0.0.0.0:8000.

如果我尝试运行在 django shell 中引发错误的同一行代码,它会起作用:

Python 3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import config
>>> getattr(config, 'Production')
<Configuration 'config.production.Production'>

wsgi.py文件包含以下内容:

import os
if os.getenv('local_settings'):
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "local.settings")
    from django.core.wsgi import get_wsgi_application
else:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config")
    os.environ.setdefault("DJANGO_CONFIGURATION", "Production")
    from configurations.wsgi import get_wsgi_application

from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

我很感激我能得到的任何帮助。

标签: pythondjangouwsgi

解决方案


你的 uwsgi 配置有点混乱

[uwsgi]
basedir = %d
chdir = %(basedir)

master=True
vacuum=True

max-requests=5000
pythonpath = %(basedir)src/
wsgi-file  = %(basedir)src/bear/wsgi.py
env = DJANGO_SETTINGS_MODULE=bear.settings.production

; -- Static serve
mimefile   = %(basedir)uwsgi.mime
static-gzip-all = true
static-check = %(basedir)public
static-safe = %(basedir)public

创建一个 uwsgi.ini 文件,在其中定义:

  • pythonpath= 定义项目的主目录。
  • wsgi-file=找到 django uwsgi.py 文件
  • env=uwsgi 将在生产模式下运行。定义环境
  • static-check=找到静态文件管理器,或者你可以用 nginx 服务它,你可以选择collectstatic
  • mimefile= mimefile.mime
uwsgi --ini uwsgi.ini --http :8000

示例:https ://github.com/LabTrendig/django-bear


推荐阅读