我的django.contrib.staticfiles设置似乎没问题,因为所有静态文件都按预期提供.但是,例如.虽然我打开了GZipMiddleware,但是/static/*.css文件没有被gzip压缩.
仅供参考.我的观点html实际上确实被gzip压缩,只有staticfiles应用程序提供的文件不.似乎这些反应不通过中间件链?
我试图找到使用django的模板上下文加载器显示图像的最有效方法.我的应用程序中有一个静态目录,其中包含图像'victoryDance.gif'和项目级别的空静态根目录(带settings.py).假设我urls.py和settings.py文件中的路径是正确的.什么是最好的观点?
from django.shortcuts import HttpResponse
from django.conf import settings
from django.template import RequestContext, Template, Context
def image1(request): # good because only the required context is rendered
html = Template('<img src="{{ STATIC_URL }}victoryDance.gif" alt="Hi!" />')
ctx = { 'STATIC_URL':settings.STATIC_URL}
return HttpResponse(html.render(Context(ctx)))
def image2(request): # good because you don't have to explicitly define STATIC_URL
html = Template('<img src="{{ STATIC_URL }}victoryDance.gif" alt="Hi!" />')
return HttpResponse(html.render(RequestContext(request)))
def image3(request): # This allows you to load STATIC_URL selectively from the …Run Code Online (Sandbox Code Playgroud) 当我尝试在webfactional上运行我的服务器上的webapp时,我在2小时内遇到了关于STATIC_URL和STATIC_ROOT的问题.
当我加载网页时,所有请求都能正常运行,除非{{STATIC_URL}}的任何链接正在运行或加载.
因此,firebug上出现的常见错误是:
GET http://mydomain/static/extras/h5bp/js/libs/modernizr-2.5.3.min.js 500 (Internal Server Error)
Run Code Online (Sandbox Code Playgroud)
我的设置是:
urls.py我什么也没做,而且静态文件也没什么.
settings.py DEBUG = False
STATIC_ROOT = '/home/mydomain/webapps/static_app/'
STATIC_URL = 'http://mydomain/static/'
STATICFILES_DIRS = ()
Run Code Online (Sandbox Code Playgroud)
views.py视图示例
@csrf_exempt
def IndexView(request):
try:
request.user.is_authenticated()
except AttributeError:
return render_to_response('index.html',
{'request': request,},
context_instance=RequestContext(request))
return render_to_response('index.html',
{'request': request, 'profile' : request.user},
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
index.html找不到代码的一部分
<script src="{{ STATIC_URL }}extras/h5bp/js/libs/modernizr-2.5.3.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
好吧,我遵循以下所有要点:https: //docs.djangoproject.com/en/1.4/howto/static-files/ 和另一个:http: //docs.webfaction.com/software/django/getting- started.html
我正在使用正确安装的应用程序,中间件,template_contexts.
如果我错过了什么,请帮助我搞清楚.
提前致谢!
- 编辑
我不得不说,如果我只是更改DEBUG = True将正常工作.
因为在urls.py上我有这段代码:
if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns += patterns('', …Run Code Online (Sandbox Code Playgroud) 我有一个Heroku设置与django压缩器压缩我的CSS和JS文件.我的默认缓存后端是用memcached设置的(在Heroku上实际上是Memcachier).我的静态文件在Amazon S3实例上提供(由django-storages和boto处理).一般来说,我的设置与django-compressor docs中的这个设置一致.
在我的页面中,指向我的压缩文件的链接有一个"过期"查询,该查询似乎是从生成链接起一小时.我不希望所有的CSS或JS请求都没有过期,因为我有一些我不压缩的CSS和JS(当我尝试时它给了我错误......可能是一个不同的问题).
但是,每小时一次链接断开,网站没有更多样式或JS.看起来链接或至少是expires标头正在被缓存而不是重新生成,因此在expires参数传递的时间过后,Amazon不再返回该文件.如果我刷新内存缓存,它会将链接中的expires标头更改为一小时,这会将问题解决一小时,直到它再次过期.
以下是美国东部时间今天,9月18日星期二下午1点39分左右生成的链接示例:https://zen180-static.s3.amazonaws.com/CACHE/css/68d31794a646.css ?Signature=u%2FTxeF7LBBZTDV79YovOjoK2tcw %3D&Expires = 1347993542&AWSAccessKeyId = AKIAIJ7VKLEX7HIMJZCA.首次生成后,页面将继续提供该链接而不进行更改.在美国东部时间2:39左右(即Unix时间1347993542,来自URL中的expires参数),该链接停止工作并发回"过期"XML消息(与现在相同).但是我的页面上仍然存在错误的链接,直到我刷新memcache.
以下是相关设置:
COMPRESS_ENABLED = True
STATICFILES_STORAGE = '[my app's name].storage.CachedS3BotoStorage' (a subclass of S3BotoStorage that is almost identical to the one from django-compressor's docs linked above)
COMPRESS_STORAGE = STATICFILES_STORAGE
COMPRESS_URL = STATIC_URL
CACHES = {
'default': {
'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
'LOCATION': 'localhost:11211',
'TIMEOUT': 500,
'BINARY': True,
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>81A63F24378ECB5E</RequestId>
<Expires>2012-09-18T18:39:02Z</Expires>
<HostId>lIr5l9Fna95DUfk6hUsWqhO5EQNn6Ayu8BatpEavis8YzLvsaJRru4O8P/50pgMy</HostId>
<ServerTime>2012-09-18T18:59:51Z</ServerTime>
</Error>
Run Code Online (Sandbox Code Playgroud) python django amazon-s3 django-staticfiles django-compressor
我想在我制作的自定义404/500页面上使用一些自定义CSS和图像.但是Django在这些页面中不包含STATIC_URL变量.实现这一目标的最佳方法是什么?我也试过制作一个自定义的404/500视图并渲染一个任意的HTML文件,但它没有那么好用.
对于我的Django项目中的第三方(jquery)代码,我采用了静态文件的目录结构,将所有第三方文件放在一个单独lib的子目录中.更具体地说,这就是我的目录树目前的样子:
myproject/
myproject/
static/
css/
my-own-stylesheet.css
lib/
bobs-stylesheet.css
joes-stylesheet.css
img/
my-own-image.png
lib/
bobs-image.png
joes-image.png
js/
my-own-javascript.js
lib/
bobs-javascript.js
joes-javascript.js
Run Code Online (Sandbox Code Playgroud)
这意味着要完成两件事:1.将我自己的资产与第三方资产分开.2.分离css,img和js文件.
当然,只要路径都是正确的,这样就可以了,但实际上是否存在Django项目中第三方材料的位置约定?
我也考虑过了
myproject/
myproject/
static/
css/
img/
js/
lib/
bob/
css/
img/
js/
joe/
css/
img/
js/
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可能过度思考这个问题,但对此有"最佳实践"吗?
这可能是一个愚蠢的问题并且有一个明显的答案,但我正在测试我的404和500错误处理程序,这意味着我必须将调试切换为False.我去了Django管理页面,注意到没有提供静态文件.
我知道它们应该通过Apache路由,因为通过Django服务静态文件是不安全的.但是,我不太明白为什么直接通过Django提供静态文件会带来安全风险?
摘要:
我应该如何引用django模板中把手 - 部件中的静态文件?如果我使用verbatim标签,我可以使用把手,但是我不能使用django的static标签.
细节
在将应用程序转换为Django时,我遇到了一个handelbars.js用于呈现ajax-call-results的部分.通过,其中包括" Django模板中的Handlebars.js ",我发现了{% verbatim %}标签.
一个简单的把手就可以正常工作.但我也有一个部分,根据结果动态显示图像,看起来像这样:
<img src="path/{{ result }}.png">
Run Code Online (Sandbox Code Playgroud)
现在虽然我可以手动设置路径,但是我相信Django最好引用你的静态文件,如下所示:
<img src="{% static 'path/file.png' %}">
Run Code Online (Sandbox Code Playgroud)
static_url不建议只获得常量,例如参见此博客
因此,除非某人有一个真正令人信服的理由来解决它,否则我认为最好使用该{% static %}方法.
天真的解决方案是将两种技术结合起来,并逐字地用verbatim/endverbatim喷涂模板.除了这看起来丑陋,难以辨认并且从一开始看似乎是一个坏主意的事实之外,它也不起作用.
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
<img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}">
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
Run Code Online (Sandbox Code Playgroud)
结果是泪流满面
TemplateSyntaxError at/
无法解析余数:''path {%'from''path {%'
有可能在后端生成正确的静态URL,并进行渲染.但是后端不应该知道我们想要在模板中显示什么图像.
只有解决方案可能是使用'relative'字符串(例如path/result.png)向后端额外调用后端,并要求正确的静态链接?这并不难,但需要额外的电话,但情况并非如此.
那么我该如何正确引用这些静态文件呢?
django templates django-templates django-staticfiles handlebars.js
我正在尝试将功能齐全(当本地且 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) 我最近在我的项目中添加了npm,以便更好地跟踪我的 js 依赖项。以前我只是将 git 克隆到我的 static/vendor 文件夹。
我还添加了gulp,但现在只让它做你好世界的事情。看起来很简单——它可以查看文件、缩小资产、编译 Sass。最终我可能会切换到Webpack,但是gulp很简单并且现在可以工作。我不想使用django-compressor或django-pipeline。
所以假设我跑去npm install vis拉取 visjs。它被添加node_modules到package.json依赖项中,并且记录被添加到依赖项中。
A)我是否在模板脚本中的 node_mods 中正确引用了 vis/dist?
<script src="/node_modules/vis/dist/min-vis.js' %}"></script>
# right now it's <script src="{% static 'vendor/min-vis.js' %}"></script
Run Code Online (Sandbox Code Playgroud)
B) gulp 是否应该监听 package.json 依赖项的更改,并在看到更改时将 vis/dist 复制到 static/vendor 或 static/js?
我一直看到人们在谈论 npm 和 gulp 时谈论处理 STATICFILE_DIRS。现在我的只是设置为以下。这会改变吗?
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
Run Code Online (Sandbox Code Playgroud) django ×10
python ×2
amazon-s3 ×1
css ×1
deployment ×1
django-1.4 ×1
frontend ×1
gulp ×1
gzip ×1
heroku ×1
javascript ×1
npm ×1
security ×1
static-files ×1
templates ×1
url ×1
webfaction ×1