在Django Python应用程序导入错误与WSGI gunicorn(Python app im

2019-06-26 12:50发布

我试图用部署在Heroku上gunicorn一个Django应用程序,我碰到几个提高警惕。

当我开始我的项目我的Django的版本是1.3,不包含标准wsgi.py模块,所以我增加了标准WSGI模块顶部/ wsgi.py(顶部是我的项目名称,土耳其人是我的应用程序名称,topturk是其所包含的目录 - 保留,这样的错误日志进行以下意义上的)。

现在,当我运行

gunicorn top.wsgi:application -b 0.0.0.0:$PORT

服务器已成功启动,

19:00:42 web.1     | started with pid 7869
19:00:42 web.1     | 2012-07-25 19:00:42 [7869] [INFO] Starting gunicorn 0.14.5
19:00:42 web.1     | 2012-07-25 19:00:42 [7869] [INFO] Listening at: http://0.0.0.0:5000 (7869)
19:00:42 web.1     | 2012-07-25 19:00:42 [7869] [INFO] Using worker: sync
19:00:42 web.1     | 2012-07-25 19:00:42 [7870] [INFO] Booting worker with pid: 7870

但后来当我浏览到0.0.0.0:5000我得到返回的内部服务器错误:

19:00:45 web.1     | 2012-07-25 17:00:45 [7870] [ERROR] Error handling request
19:00:45 web.1     | Traceback (most recent call last):
19:00:45 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 102, in handle_request
19:00:45 web.1     |     respiter = self.wsgi(environ, resp.start_response)
19:00:45 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
19:00:45 web.1     |     self.load_middleware()
19:00:45 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 47, in load_middleware
19:00:45 web.1     |     raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
19:00:45 web.1     | ImproperlyConfigured: Error importing middleware turk.middleware.subdomain: "No module named turk.middleware.subdomain"
19:00:47 web.1     | 2012-07-25 17:00:47 [7870] [ERROR] Error handling request
19:00:47 web.1     | Traceback (most recent call last):
19:00:47 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 102, in handle_request
19:00:47 web.1     |     respiter = self.wsgi(environ, resp.start_response)
19:00:47 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
19:00:47 web.1     |     self.load_middleware()
19:00:47 web.1     |   File "/Users/intenex/Dropbox/code/django/topturk/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 47, in load_middleware
19:00:47 web.1     |     raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
19:00:47 web.1     | ImproperlyConfigured: Error importing middleware turk.middleware.subdomain: "No module named turk.middleware.subdomain"

我假设这是一个Python路径误差,其中,服务器不知道如何从我的应用程序目录中导入

有关进口的代码是在这里设置:

MIDDLEWARE_CLASSES = (
    'turk.middleware.subdomain.SubdomainMiddleware',
    'turk.middleware.removewww.RemoveWWWMiddleware',
)

我试图通过我的settings.py文件中,像这样的顶部插入我的应用程序目录到sys.path中像这样来解决这个问题:

PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(1, PROJECT_ROOT+'/turk/')

我已经验证了添加应用程序目录的路径,但仍然没有骰子。 有任何想法吗? 也

sys.path.insert(1, PROJECT_ROOT+'/turk/')

似乎hackish的,并增加了目录的至少两个拷贝的路径,什么是追加到PYTHON_PATH在Django正确的方法是什么? 谢谢!

Answer 1:

想通了我的问题。 需要添加的项目目录到Python路径,而不是应用程序目录 - 即topturk /顶,而不是topturk /顶/土耳其人以进口土耳其人目录模块。

python top/manage.py run_gunicorn

python top/manage.py runserver

进行工作得很好,因为按照Python路径中的文档调用模块的目录始终作为在Python路径元组元素0 - 等正在使用顶部/ manage.py时被,topturk /顶部总是在Python路径。

对Heroku然而,Procfile是项目,topturk的父目录,而不是topturk /顶,所以当Procfile命令运行topturk被添加到Python的路径,但不topturk /顶,因此错误。

事后看来,想通了,这就是Django文档指的是在本节的最后一句: https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#running-django-in -gunicorn,作为一种通用的,WSGI的应用程序 ,他们为了运行此命令的项目必须是Python路径上说。

问题通过添加解决

sys.path.insert(1, os.path.dirname(os.path.realpath(__file__)))

要么settings.py或wsgi.py - 加入的settings.py作为这似乎是一些什么其他人推荐(http://codespatter.com/2009/04/10/how-to-add-locations-to-蟒蛇路径换可重复使用的,Django的应用程序/),但不知道什么是最好的地方,把插入的。 任何人都知道吗?



Answer 2:

那么上面的方法已经被gunicorn现在已经过时。 当我试图相同的,如果失败,警告信息!

(VENV)根@ IP-172-31-23-172:〜/的Myproj#蟒manage.py run_gunicorn 0.0.0.0:8001

! 警告:此命令已被弃用。

! 现在,您应该运行与WSGI界面应用程序

! 安装与您的项目。 例:

! gunicorn myproject.wsgi:应用

! 见https://docs.djangoproject.com/en/1.5/howto/deployment/wsgi/gunicorn/

! 获取更多信息。

因此,我想下面的命令,它为我工作。

gunicorn myproject.wsgi:application


Answer 3:

添加“gunicorn”到settings.py/INSTALLED_APPS和使用

python manage.py run_gunicorn 127.0.0.0:8001

(不管你喜欢的端口)欲了解更多信息,请访问: https://pypi.python.org/pypi/gunicorn/



文章来源: Python app import error in Django with WSGI gunicorn