我正在尝试将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但它没有加载它们时。
有人可以指出我的错误吗?哪里错了?
答案 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
时会自动生成此文件夹
确保文件夹static
和templates
位于您的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