簡體   English   中英

使用WSGI gunicorn在Django中導入Python應用程序錯誤

[英]Python app import error in Django with WSGI gunicorn

我正在嘗試在Heroku上部署一個帶有gunicorn的Django應用程序,但我遇到了幾個問題。

當我開始我的項目時,我的Django版本是1.3並且不包含標准的wsgi.py模塊,所以我添加了標准的wsgi模塊作為top / wsgi.py(頂部是我的項目名稱,turk是我的應用程序名稱,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',
)

我試圖通過將我的app目錄插入到sys.path中來解決這個問題,就像我在settings.py文件的頂部一樣,如下所示:

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

我已經驗證過將app目錄添加到路徑中,但仍然沒有骰子。 有任何想法嗎?

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

似乎是hackish並且至少將兩個目錄副本添加到路徑中,在Django中附加到PYTHON_PATH的正確方法是什么? 謝謝!

找出我的問題。 需要將項目目錄添加到Python路徑,而不是app目錄 - 即topturk / top而不是topturk / top / turk以便導入turk目錄模塊。

python top/manage.py run_gunicorn

python top/manage.py runserver

工作得很好,因為根據Python路徑文檔,調用模塊的目錄總是作為元素0添加到Python路徑元組中 - 所以當使用top / manage.py時,topturk / top總是在Python路徑中。

然而,使用heroku,Procfile位於項目的父目錄中,topturk而不是topturk / top,因此當procfile命令運行時,topturk被添加到Python路徑但不是topturk / top,因此也就是錯誤。

事后看來,弄清楚這是Django文檔在本節的最后一句中所指的內容: https//docs.djangoproject.com/en/dev/howto/deployment/wsgi/gunicorn/#running-django-in -gunicorn-as-a-generic-wsgi-application ,他們說為了運行這個命令,項目必須在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- python-path-for-reusable-django-apps /),但不確定插入的最佳位置是什么。 誰知道?

以上方法現已被gunicorn棄用。 當我嘗試相同但如果失敗並帶有警告信息!

(venv)root @ ip-172-31-23-172:〜/ myproj #python 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

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

python manage.py run_gunicorn 127.0.0.0:8001

(無論您喜歡什么端口)欲了解更多信息,請訪問: https//pypi.python.org/pypi/gunicorn/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM