没有加载Heroku静态文件,Django

时间:2015-03-10 10:23:57

标签: python django heroku django-staticfiles

我正在尝试将my Django project推送到Heroku,但它没有加载静态文件。

我使用this来设置内容,一切都很好,但我无法解决静态文件的问题。

我的目录结构是这样的

help_the_needy
    help_the_needy
        __init__.py
        settings.py
        urls.py
        views.py
        wsgi.py
    manage.py
    Procfile  
    requirements.txt  
    static
        css
        font-awesome
        fonts  
        img  
        js
    templates
        base.html
        display_list2.html
        index.html

Here是完整的代码(所有文件)。

This是我的settings.py。

我尝试了很多东西来解决这个问题,但似乎没什么用。

当我按下它does copy static files但它没有加载它们时。

有人可以指出我的错误吗?哪里错了?

6 个答案:

答案 0 :(得分:6)

我一直在处理同样的问题。以下是我在代码中更改的两件事。

(我正在使用Django 1.7)

1)settings.py

我将这些行添加到设置文件

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR,  'templates'),
    # Add to this list all the locations containing your static files 
)

STATIC_ROOT:这告诉Django(a)在运行python manage.py collectstatic时放置静态文件和(b)在运行应用程序时找到静态文件

TEMPLATE_DIRS:这告诉Django在运行python manage.py collectstatic

时搜索静态文件时在哪里查找静态文件

2)wsgi.py

最初我的档案是:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

我改为:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)

请阅读此处了解有关whitenoise的更多信息:https://devcenter.heroku.com/articles/django-assets#whitenoise

另外,请记住安装whitenoise:     pip install whitenoise==2.0.6

在部署项目之前,运行:     python manage.py collectstatic

这将创建一个由STATIC_ROOT指示的文件夹(在settings.py中声明),其中包含所有静态文件。

答案 1 :(得分:1)

自从发布这篇文章已经有几年了(当我搜索问题时它仍然会弹出),以下是在 Django 3.2 中对我有用的内容。

pip install whitenoise

确保在 settings.py 中有

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

向中间件添加白噪声:

MIDDLEWARE = [
    'whitenoise.middleware.WhiteNoiseMiddleware',
]

确保您指定为 STATIC_ROOT(静态文件)的目录存在于您的基本目录中并且不为空。

在那之后,我提交了更改,Heroku 能够构建静态文件并且一切正常。

答案 2 :(得分:0)

您的STATICFILES_DIRS设置错误。它应该指向"静态"的实际位置。包含文件的目录:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

答案 3 :(得分:0)

public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder().include(SO.class.getSimpleName()).jvmArgs("-Dfile.encoding=UTF-8").build();
    new Runner(opt).run();
}

public static final class Person {
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    String name;
    int age;
    public int getAge() {return age;};
    public String getName() {return this.name;}
}

public static final List<Person> persons = IntStream.range(0, 100).mapToObj(i -> new Person("person" + i, RandomUtils.nextInt(0, 50))).collect(Collectors.toList());

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 5, time = 4, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 4, time = 5, timeUnit = TimeUnit.SECONDS)
@Fork(2)
public float collectingAndThen() {
    String personWithMaxAge = persons.stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.maxBy(Comparator.comparing(Person::getAge)),
                    (Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
            ));
    return personWithMaxAge.length() * 1.0f;
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 5, time = 4, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 4, time = 5, timeUnit = TimeUnit.SECONDS)
@Fork(2)
public float sortFindFirst() {
    String personWithMaxAge2 = persons.stream().sorted(Comparator.comparing(Person::getAge).reversed())
            .findFirst().get().name;
    return personWithMaxAge2.length() * 1.0f;
}

将whitenoise添加到requirement.txt。 按照https://devcenter.heroku.com/articles/django-assets

中的步骤操作

答案 4 :(得分:-1)

看起来django不知道你的static_root在哪里。 触发manage.py collectstatic时会自动生成此文件夹 确保文件夹statictemplates位于您的django应用内。你没有创建一个django应用程序来放置这个文件夹。你创建了一个django项目,下一步就是用这样的python manage.py startapp polls创建一个django应用程序

# Absolute filesystem path to the Django project directory:
DJANGO_ROOT = dirname(dirname(abspath(__file__)))
# Absolute filesystem path to the top-level project folder:
SITE_ROOT = dirname(DJANGO_ROOT)

STATIC_URL = '/static/'
STATIC_ROOT = normpath(join(SITE_ROOT, 'static_root'))

答案 5 :(得分:-1)

您的urls.py文件缺少管理和路由静态资源请求的设置。

为了提供对静态资源的访问权限,您必须添加到urlpatterns的{​​{1}}:

urls.py