芹菜3工人与Django Herokuapp

时间:2014-06-30 08:21:20

标签: python django heroku celery

我有一个Django应用程序,它有一个项目布局,如django book的两个独家新闻中所述。

├── CONTRIBUTORS.txt
├── LICENSE.txt
├── Procfile
├── README.rst
├── docs
├── requirements
│   ├── base.txt
│   ├── local.txt
│   ├── production.txt
│   └── test.txt
├── requirements.txt
└── PROJECT_NAME
    ├── __init__.py
    ├── app_name
    │   ├── __init__.py
    │   ├── models.py
    │   ├── views.py
    ├── manage.py
    ├── PROJECT_NAME_APP
    │   ├── __init__.py
    │   ├── celery.py
    │   ├── settings
    │   │   ├── __init__.py
    │   │   ├── base.py
    │   │   ├── local.py
    │   │   ├── production.py
    │   │   ├── test.py
    │   ├── urls.py
    │   ├── wsgi.py
    ├── static
    │   ├── css
    │   ├── fonts
    │   └── js
    └── templates

将此部署到HerokuHeroku文档略有不同,因为应用程序的文件路径略有不同。但是我将它们修改为适当的路径并且工作正常。请注意,我的PROJECT_NAME_APP文件夹实际上与我的顶级项目文件夹的命名方式不同,这是我为了让应用程序在Heroku上运行所做的更改

我现在正在尝试添加Celery工作人员。我使用的Celery版本并不需要django-celery包。在我的Procfile中,我有这一行来定义worker:

  

worker:celery worker --app = project_name.project_name_app.celery

我创建的芹菜文件位于celery docs之后,位于PROJECT_NAME_APP。

import os

from __future__ import absolute_import
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project_name_app.settings.local')
app = Celery('project_name_app')
app.config_from_object('django.conf:settings')

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

我发现了一些关于在DJANGO_SETTINGS_MODULE中设置Heroku的建议,但这似乎打破了其他事情,所以我解除了它。

我现在得到的错误是:

ImportError: Could not import settings 'project_name_app.settings.local' (Is it on sys.path?): No module named project_name_app.settings.local

我理解错误说的是什么,但我发现很难在Heroku上调试。我已尝试在本地使用foreman start来调试我的Procfile,但由于本地与生产设置的原因,它会使我的SECRET_KEY抛出错误。

有人可以看到为什么我的设置在生产中运行时会抛出错误吗?

1 个答案:

答案 0 :(得分:0)

因此,我在wsgi.py文件

中注意了几个小时的设置
import os
from os.path import abspath, dirname
from sys import path

SITE_ROOT = dirname(dirname(abspath(__file__)))
path.append(SITE_ROOT)

# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "jajaja.settings"

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restaurants_app.settings.production")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())

它创建一个SITE_ROOT var然后将其添加到路径中。我在celery.py文件中做了同样的事情,但它确实有效。