介绍:


我正在遵循Getting Started with Django on Heroku快速入门指南。
我打算应用有关使用virtualenvs和项目的Django的两个独家思想。 Audrey Roy和Daniel Greenfeld(作者)喜欢将所有环境放在一个目录中,而所有项目都放在另一个目录中。
我还打算应用Django的两个瓢虫的书本哲学,即将django-admin.py startproject管理命令生成的内容放置在另一个目录中,该目录用作git信息库的根(也称为三层方法)。


最高层的布局:

repository_root/
    django_project_root/
        configuration_root/




本地:

OS X 10.8.4
点== 1.4.1
virtualenv == 1.10.1
virtualenvwrapper == 4.1.1
wsgiref == 0.1.2
.bashrc包含:

export WORKON_HOME=$HOME/Envs
export PROJECT_HOME=$HOME/Projects


〜/环境
〜/项目



在hellodjango_venv内部:

Django = = 1.5.2
dj-database-url == 0.2.2
dj-static == 0.0.5
django-toolbelt == 0.0.1
gunicorn == 18.0
psycopg2 == 2.5.1
静态== 0.4



从终端:

mac-pol:~ oubiga$ mkdir -p Projects/hellodjango_rep/hellodjango
mac-pol:~ oubiga$ cd Projects/hellodjango_rep/hellodjango
mac-pol:hellodjango oubiga$ mkvirtualenv hellodjango_venv
New python executable in hellodjango_venv/bin/python2.7
Also creating executable in hellodjango_venv/bin/python
Installing Setuptools..................................

...

..................................................done.
(hellodjango_venv)mac-pol:hellodjango oubiga$ pip install django-toolbelt

...

Successfully installed django-toolbelt django psycopg2 gunicorn dj-database-url dj-static static
Cleaning up...
(hellodjango_venv)mac-pol:hellodjango oubiga$ django-admin.py startproject hellodjango .
(hellodjango_venv)mac-pol:hellodjango oubiga$ touch Procfile && open Procfile


编辑Procfile:

web: gunicorn hellodjango.wsgi

开始过程:

(hellodjango_venv)mac-pol:hellodjango oubiga$ foreman start
01:30:37 web.1  | started with pid 638
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Starting gunicorn 18.0
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Listening at: http://0.0.0.0:5000 (638)
01:30:37 web.1  | 2013-09-04 01:30:37 [638] [INFO] Using worker: sync
01:30:37 web.1  | 2013-09-04 01:30:37 [641] [INFO] Booting worker with pid: 641
CTRL+C


到目前为止,一切都很好。

目前,我的项目树是:

~/Projects/
    hellodjango_rep/
        hellodjango/ cwd
            manage.py
            Procfile
            hellodjango/
                __init__.py
                settings/
                urls.py
                wsgi.py


我的Virtualenvs树是:

~/Envs/
    get_env_details
    initialize
    postactivate
    postdeactivate
    postmkproject
    postmkvirtualenv
    postrmproject
    postrmvirtualenv
    preactivate
    predeactivate
    premkproject
    premkvirtualenv
    prermproject
    prermvirtualenv
    hellodjango_venv/
        bin/
        include/
        lib/


但是,您还记得三层方法吗?我该如何实现?

我很确定hellodjango_rep /稍后至少会包含:.git,.gitignore和requirements.txt



研究:

在#django IRC频道上,Jacob Kaplan-Moss回答了:


... Procfile必须位于git仓库的顶层...


Heroku的工程师Neil Middleton在SO中回答了这个问题“ Procfile在Heroku中声明了类型->(无)”:


...您的Procfile必须位于您的git存储库的根目录中
被推到Heroku ...


从Heroku开发中心:


...过程类型通过放置在
您应用的根目录...




第一次尝试:

我将Procfile上移一个文件夹级别。

(hellodjango_venv)mac-pol:hellodjango oubiga$ cd ..


目前,我的项目树是:

~/Projects/
    hellodjango_rep/ cwd
        Procfile
        hellodjango/
            manage.py
            hellodjango/
                __init__.py
                settings/
                urls.py
                wsgi.py


我再次开始该过程:

(hellodjango_venv)mac-pol:hellodjango_rep oubiga$ foreman start


我会得到ImportError: No module named hellodjango.wsgi



调试:

ImportError似乎来自/Users/oubiga/Envs/hellodjango_venv/lib/python2.7/site-packages/gunicorn/util.py

def import_app(module):
    parts = module.split(":", 1)
    if len(parts) == 1:
        module, obj = module, "application"
    else:
        module, obj = parts[0], parts[1]

    try:
        __import__(module)  # <-- line 354
    except ImportError:
        if module.endswith(".py") and os.path.exists(module):
            raise ImportError("Failed to find application, did "
                "you mean '%s:%s'?" % (module.rsplit(".", 1)[0], obj))
        else:
            raise

...


没有名为hellodjango.wsgi的模块



第二次尝试:

Procfile返回上一级。 Procfile和manage.py再次归为一类。

(hellodjango_venv)mac-pol:hellodjango_rep oubiga$ foreman start


我会得到ERROR: Procfile does not exist.很明显为什么会发生。



假设:

从Django文档中:


... manage.py是在每个Django项目中自动创建的。
manage.py是django-admin.py的薄包装,它负责
在委派给django-admin.py之前,为您准备了两件事:
-将您项目的软件包放在sys.path中。
-设置DJANGO_SETTINGS_MODULE环境变量,使其指向您项目的settings.py文件...


我不确定问题是否与此有关。



所以:

是否可以在不同文件夹级别具有Procfile和manage.py文件?
这种方法有什么问题?


先感谢您。

最佳答案

首先,我不得不说,我还没有进行过如此广泛的研究,并且已经使用Heroku约3次。但:

(您的第二次尝试):

Procfile确实应该在顶级目录中。如果将Procfile移到更深的深层,则找不到。

(您的首次尝试):

并且将您的Procfile放在顶层目录中,您应该指出wsgi的路径。这还不可能。因此,应在第一个“ hellodjango”目录中创建__init__.py文件,以将其标记为“ module”。然后您应该将Procfile中的路径更改为:hellodjango.hellodjango.wsgi

希望这可以帮助。

关于django - 是否可以在不同的文件夹级别具有Procfile和manage.py文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18619886/

10-11 08:42