10

我的 Django 1.3 项目在开发服务器上提供静态文件,但不提供 gunicorn 服务器静态文件。我按照这个 Heroku 指南的步骤进行操作。

当我像在指南()中那样使用我的 procfile 的内容时 web: gunicorn myproject_django.wsgi -b 0.0.0.0:$PORT,Heroku 无法识别我的项目。

然后我将该 Procfile 更改为:

web: python myproject_django/manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3

现在我的应用程序运行除了静态文件(css 不活动也不图像)。

我的项目树:

.
├── Procfile
├── myproject_django
│   ├── core
│   │   ├── admin.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── base.css
│   │   │   │   ├── layout.css
│   │   │   │   
│   │   │   └── media
│   │   │       ├── pek.ico
│   │   │       ├── pek.png
│   │   │       ├── pek_symbol.png
│   │   ├── tests.py
│   │   └── views.py
│   ├── __init__.py
│   ├── manage.py
│   ├── settings.py
│   ├── templates
│   │   └── core
│   │       ├── home.html
│   │       └── install.html
│   └── urls.py
└── requirements.txt

settings.py 的潜在相关部分

MEDIA_ROOT = ''

MEDIA_URL = '/static/media'

STATIC_ROOT = ''

STATIC_URL = '/static/'

ADMIN_MEDIA_PREFIX = '/static/admin/'

STATICFILES_DIRS = (
    os.path.abspath(__file__)+'/..'+'/myproject_django/core/static', 
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)


INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'gunicorn',
    'django.contrib.admin',
)

编辑

在 Francis Yaconiello 进入后,我调整了以下内容:

在 settings.py

STATIC_ROOT = os.path.join(os.getcwd(),'core/static')
STATICFILES_DIRS = ( os.path.abspath(__file__)+'/..'+'/core/static', )

在 gitignore 中:

staticfiles/*

然后就答应了。最后跑了heroku run python myproject_django/manage.py collectstatic

但是当我检查网页时仍然没有提供静态文件。鉴于我的目录树,为什么这些更改不起作用?

编辑2

我仍然看不到我的静态文件。当我点击图像时,DEBUG=True我得到这个:

Request URL: http://myproject.herokuapp.com/static/media/pek.png

(注意staticfiles目录是空的)

.
├── Procfile
├── myproject_django
│   ├── admin
│   ├── core
│   │   ├── admin.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── base.css
│   │   │   │   ├── layout.css
│   │   │   └── media
|   |   |       ├── pek.ico
|   │   │       ├── pek.png
|   │   │       ├── pek_symbol.png
│   │   ├── tests.py
│   │   ├── views.py
│   ├── __init__.py
│   ├── manage.py
│   ├── settings.py
│   ├── staticfiles
│   ├── templates
│   │   └── core
│   │       ├── 404.html
│   │       ├── 500.html
│   │       ├── home.html
│   │       └── install.html
│   ├── urls.py
└── requirements.txt

在 settings.py

PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'static/media')
STATIC_ROOT = os.path.join(PROJECT_PATH,'staticfiles')
STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'core/static'),
)
4

5 回答 5

5

指定您的STATIC_ROOT

我通常将其设置为:

import os
STATIC_ROOT = os.path.join(os.getcwd(), "staticfiles")

在您的项目中创建该目录

mkdir staticfiles

确保静态文件的内容没有被 git 跟踪

nano .gitignore

添加

staticfiles/*

然后提交并推送到heroku。

最后,

heroku run python manage.py collectstatic

编辑

STATIC_ROOT = os.path.join(os.getcwd(),'core/static')
STATICFILES_DIRS = ( os.path.abspath(__file__)+'/..'+'/core/static', )

这两个设置不能是一回事。

STATICFILES_DIR没关系,如果多余的话,你STATICFILES_FINDERS已经告诉它在static每个应用程序的目录中查找静态文件:'django.contrib.staticfiles.finders.AppDirectoriesFinder',

关键STATIC_ROOT是提供一个与您的项目完全分离的新目录,您可以使用第三方服务器(如 nginx)提供服务。这就是您创建该目录的原因staticfiles

STATIC_ROOT = os.path.join(os.getcwd(),'staticfiles')

另一个编辑

临时文件系统的解决方法

每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。在 dyno 的生命周期中,它的运行进程可以将文件系统用作临时暂存器,但是任何其他 dyno 中的进程都看不到写入的文件,并且在停止或重新启动 dyno 时,写入的任何文件都将被丢弃。

这意味着只要您在 Web 启动期间在每个 dyno 实例上收集静态数据,就不会出现任何问题。

web: python myproject_django/manage.py collectstatic --noinput; python myproject_django/manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3

也就是说,我目前使用 S3 和 django 存储http://django-storages.readthedocs.org/en/latest/index.html。实现这一点相当容易(而且便宜)。

于 2012-08-16T19:34:08.390 回答
4

有一种解决方案。

在 urls.py 中添加:

from django.conf import settings

urlpatterns += patterns('',
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
)

ps对于STATIC_URL = '/static/'

于 2012-12-21T15:05:05.253 回答
1

我遇到了同样的问题;看来您特别需要这三个设置:

  1. STATIC_ROOT必须在您的 中定义settings.py,例如:

    STATIC_ROOT = os.path.join(PROJECT_PATH, 'served/static/')
    

    您的项目根目录在哪里PROJECT_PATH(在您的情况下,是myproject_django目录的绝对路径。

  2. 同样,STATIC_URL也必须设置(如果你不这样做,Django 无论如何都会抛出一个 ImproperlyConfigured 错误)。您当前的设置'/static/'很好。

  3. 在您的 rooturls.py中,配置静态 url:

    from django.conf import settings
    from django.conf.urls.static import static  
    
    ...
    
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

最后,运行python manage.py collectstatic;这会将所有文件从 复制/path/to/site-packages/django/contrib/admin/static/admin//served/static/. (您可以在此处阅读有关 Django 如何提供静态文件的更多信息)。

现在,当您运行时foreman start,您应该会看到带有样式的管理员。

不要忘记添加served/static/到您的.gitignore!

于 2013-10-07T21:44:39.527 回答
1

使用作为heroku-django-cookbook提供的run_collectstatic一部分运行的脚本。它利用Heroku python buildpack 提供的钩子post_compilepost_compile

于 2013-03-18T12:31:06.430 回答
0

我在这里找到了解决 Heroku 上 Django 的所有问题的好方法

于 2014-01-23T06:48:54.043 回答