我正在尝试将功能齐全(当本地且 Debug=True 时)站点部署到 Heroku。当我使用默认的 Django staticfile_storage 设置时,我的网站显示为活动状态,但没有任何静态文件(css、图像等)。管理面板可以工作,但也没有任何样式。
但是,当我尝试使用 Whitenoise(这正是我最初的意图)时,我收到服务器 500 错误。届时管理面板将无法工作。我一生都无法弄清楚我做错了什么。
我尝试按照 Heroku 的模板来建模我的 settings.py 文件: https://github.com/heroku/heroku-django-template和 Whitenoise 的文档http://whitenoise.evans.io/en/latest/django.html。
当我查看最近的 Heroku 日志时,我看到
at=info method=GET path="/static/css/styles.css" host=www.mysite.net request_id=826280da-21ba-48a1-8a05-679c92871d38 dyno=web.1 connect=0ms service=3ms status=404 bytes=361
Run Code Online (Sandbox Code Playgroud)
当我推送到 Heroku 时,部署成功,但是当我运行时
heroku run python3 manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)
它说我必须覆盖预先存在的文件(是/否),当我说是时,我收到一条错误消息,指出找不到 app/static 目录。
我非常困惑——我可能做错了什么?如果我的静态文件目录不正确,我该如何找到它?
项目结构
mysite/
blog/
static/
css/
styles.css
images/
favicon.png
templates/
blog/
blog_list.html
blog_detail.html
index.html
bio.html
resume.html
models.py
views.py
urls.py
media/
portfoliopieces/
1.png
2.png
3.png
4.png
mysite/
settings.py
urls.py
wsgi.py
portfolio/
templates/
portfolio_list.html
portfolio_detail.html
models.py …Run Code Online (Sandbox Code Playgroud) Django建议我,如果我只使用一台服务器(Apache)来提供动态和静态文件,那么我应该使用静态文件django.contrib.staticfiles.
所以在我,settings.py我已经加载django.contrib.staticfiles到我INSTALLED_APPS和django.core.context_processors.static我的TEMPLATE_CONTEXT_PROCESSORS.
我注意到在管理模板中它链接到这样的静态文件(来自index.html):
{% load i18n admin_static %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %}
Run Code Online (Sandbox Code Playgroud)
但是看一下模板标签admin_static,它只是一个包装器static:
from django.conf import settings
from django.template import Library
register = Library()
if 'django.contrib.staticfiles' in settings.INSTALLED_APPS:
from django.contrib.staticfiles.templatetags.staticfiles import static
else:
from django.templatetags.static import static
static = register.simple_tag(static)
Run Code Online (Sandbox Code Playgroud)
所以我得出结论,因为每个管理静态文件都是带有admin/...前缀的服务器,那么完整路径(对于我的情况)应该是
/usr/lib64/python2.7/site-packages/django/contrib/admin/static
Run Code Online (Sandbox Code Playgroud)
所以我将该路径设置为我的STATICFILES_DIRS内部settings.py,但Apache仍然不会提供任何静态文件(在重新启动服务器之后).我的逻辑在哪里犯了错误?
我正在使用Django 1.3.1和contrib.collectstatic应用程序来管理我的静态文件.
我的项目结构是
myproject
- settings.py
- static-media
- urls.py
- media
- manage.py
Run Code Online (Sandbox Code Playgroud)
其中static-media是包含此项目的静态文件的文件夹.在我的settings.py中,我有:
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
STATIC_ROOT = os.path.join(PROJECT_PATH, "static")+'/'
STATIC_URL = "/static/"
STATICFILES_DIRS = (
os.path.join(PROJECT_PATH, 'static-media'),
)
Run Code Online (Sandbox Code Playgroud)
我正在使用admin_tools来更改管理员的布局.但是我想从admin_tools覆盖特定的css文件(theming.css).所以在我的静态媒体文件夹中我放了admin_tools/css/theming.css.当我第一次运行时python manage.py collectstatic,它通过忽略admin_tools中的默认的theming.css并使用我在static-media中定义的那个来按预期工作.不幸的是,如果我再次运行该命令,它会覆盖我的css并添加默认值.
这是输出python manage.py findstatic admin_tools/css/theming.css:
Found 'admin_tools/css/theming.css' here:
/home/paulo/Desktop/Projects/zennetwork/prd/zennetwork/static-media/admin_tools/css/theming.css
/home/paulo/Desktop/Projects/zennetwork/prd/lib/python2.7/site-packages/admin_tools/theming/static/admin_tools/css/theming.css
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.谢谢.
我正在尝试将django-compressor和django-storages-redux与django staticfiles和Amazon S3一起使用.这些是我的设置:
STATIC_URL = COMPRESS_URL = 'http://my-bucket.s3-us-west-2.amazonaws.com/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'site-static'),
)
COMPRESS_PRECOMPILERS = (
('text/scss', 'sass --scss --compass {infile} {outfile}'),
)
COMPRESS_CSS_FILTERS = [
'compressor.filters.css_default.CssAbsoluteFilter',
'compressor.filters.cssmin.CSSMinFilter',
]
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE = 'myapp.apps.mymodel.storage.CachedS3BotoStorage'
COMPRESS_OUTPUT_DIR = 'cache'
COMPRESS_ENABLED = False
AWS_S3_HOST = "s3-us-west-2.amazonaws.com"
AWS_ACCESS_KEY_ID = '---'
AWS_SECRET_ACCESS_KEY = '---'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
AWS_QUERYSTRING_AUTH = False
AWS_S3_CUSTOM_DOMAIN = 'my-bucket.s3-us-west-2.amazonaws.com'
Run Code Online (Sandbox Code Playgroud)
对于静态文件,我使用自定义存储后端,如此处所建议http://django-compressor.readthedocs.org/en/latest/remote-storages/
from django.core.files.storage import get_storage_class
from …Run Code Online (Sandbox Code Playgroud) django amazon-s3 django-storage django-staticfiles django-compressor
我已经完成了我在Django的第一个应用程序并且工作得很好,但是因为我设置了DEGUG = False,所以仍然有预部署问题...这里只是在模板中显示图像... T_T
我正在使用它,但现在当我使用whitenoise为我的图像提供服务时它无法工作......并且它返回错误请求(400)错误...
class GalleryItem(models.Model):
thumbnail = models.ImageField(blank=True,upload_to='gallery/thumb')
img_wide = models.ImageField(blank=True,upload_to='gallery')
Run Code Online (Sandbox Code Playgroud)
{% load staticfiles %}
{% for img in img_to_display %}
<a href="{{ img.img_wide.url}}" class="swipebox" title="">
<img src="{% static img.thumbnail.url %}" alt="{{ img.alt}}">
</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
import os
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^gallery/', include('gallery.urls')),
url(r'^shop/', include('shop.urls')),
url(r'^events/', include('events.urls')),
url(r'^page/', include('paginator.urls')),
url(r'^news/', include('blog.urls')),
url(r'^ckeditor/', include('ckeditor_uploader.urls')), …Run Code Online (Sandbox Code Playgroud) 我参与了一个使用白噪声来提供静态文件的应用程序。它被配置为使用CompressedManifestStaticFilesStoragewhich 依次使用ManifestStaticFilesStorage.
我所说的静态文件是指我们提供的静态文件,以及第三方的传单等库。
该类ManifestStaticFilesStorage由 Django 提供,将重命名文件名以包含哈希值。用于缓存清除。它过滤资源并更改对文件的未散列引用以包含散列。
这又破坏了传单中的一个功能:
_detectIconPath: function () {
var el = DomUtil.create('div', 'leaflet-default-icon-path', document.body);
var path = DomUtil.getStyle(el, 'background-image') ||
DomUtil.getStyle(el, 'backgroundImage'); // IE8
document.body.removeChild(el);
return path.indexOf('url') === 0 ?
path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : '';
}
Run Code Online (Sandbox Code Playgroud)
问题是 的值path看起来像:
url("https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")
Run Code Online (Sandbox Code Playgroud)
由于文件名不匹配,第二次替换不会执行任何操作。这又将返回:
https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")
Run Code Online (Sandbox Code Playgroud)
当传单尝试将文件名附加到这个“目录”时,我们得到:
https://example.org/static/path/leaflet/dist/images/marker-icon.2273e3d8ad92.png")marker-icon.png
Run Code Online (Sandbox Code Playgroud)
这显然是错误的。
那么解决办法是什么呢?我被告知我们不应该尝试对第三方包的文件名进行哈希处理,否则可能会出现其他损坏。但是,我没有看到任何选项来ManifestStaticFilesStorage排除某些目录被散列。
我创建了以下课程来尝试解决此问题。我在设置中引用此类而不是CompressedManifestStaticFilesStorage.
class MyStorage(CompressedManifestStaticFilesStorage):
""" This class overrides the built in class and turns off file name hashing …Run Code Online (Sandbox Code Playgroud) 我似乎无法找到如何刷新白噪声静态文件缓存。它一直给我带来一个问题。即使我删除了导致问题的特定文件,这种情况仍然存在。清单仍然提到丢失的已删除静态文件。我想清除缓存以便可以重新填充它。我正在使用带有 django 的 docker-container
我有一个使用 AngularJS 的 django 应用程序以及一堆 JavaScript 和模板文件。
在我的 django 模板中,我可以使用{% static %}标签来正确引用这些文件,如下所示:
<script src="{% static "angular/myapp.app.js" %}"></script>
Run Code Online (Sandbox Code Playgroud)
然而,外部文件本身显然无法通过 django 的模板框架来解析,因此这不是一个选择。因此,人们最常做的就是对静态路径进行硬编码:
$routeProvider.when('/', {
// this works but is not ideal
templateUrl: '/static/pages/some-angular-template.html',
})
Run Code Online (Sandbox Code Playgroud)
我已经STATIC_URL在某处看到了加载到 javascript 并使用它来构造引用的建议。像这样的东西:
姜戈模板:
var STATIC_URL = {{ STATIC_URL }};
function getStaticUrl(templatePath) {
return STATIC_URL + templatePath;
}
Run Code Online (Sandbox Code Playgroud)
外部JS:
$routeProvider.when('/', {
templateUrl: getStaticUrl('/pages/some-angular-template.html'),
})
Run Code Online (Sandbox Code Playgroud)
这好一点,但仍然不完美,因为它只处理基本路径。如果您想使用类似的东西ManifestStaticFilesStorage(我就是这样做的),那么您仍然无法获得文件的正确分辨率。
对于这个问题有什么好的解决办法吗?我正在考虑的选项:
我希望在我的 django 项目中使用 date-fns,但不完全确定如何继续 - 我不能依赖 CDN,需要以某种方式安装它。我已经npm init在我的根文件夹中运行,然后是npm install date-fns. 这生成了一个node_modules文件夹和一个package.json文件。
不完全确定此后如何继续。有哪些必要的步骤?
我只是使用
<script src="{% static 'node_modules/date-fns' %}"></script>
Run Code Online (Sandbox Code Playgroud)
在我的 base.html 文件中?
我collectstatic几周前运行过,我想删除大部分(99.5%)收集的文件,这样我在部署到生产时就不必存储它们。我尝试过collectstatic --clear,但这删除了它们,然后将删除的文件放回原处(不确定该命令的实际意义是什么。文档声明它用于“删除陈旧的静态文件”,但它肯定不会这样做)。有没有办法删除收集的文件?
我一直在使用Django 文档的此页面来尝试找到解决方案,但没有任何运气。
django ×10
python ×4
amazon-s3 ×1
angularjs ×1
apache ×1
bad-request ×1
docker ×1
heroku ×1
leaflet ×1
static-files ×1
whitenoise ×1