我正在使用WSGI和Apache运行Django生产服务器.
我想知道collectstatic每次修改一个静态文件时是否必须运行.
是不是有办法让WSGI或任何一个程序自动化这个过程?
我在Heroku上运行Django.我可以成功运行collectstatic,但是当我访问该站点时,很明显Django无法找到我的静态文件.这是我设置的一个片段 - 我认为它主要是标准的东西:
STATIC_ROOT = ''
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_DIR, 'static'),
)
# List of finder classes that know how to find static files in
# various locations.
if CLAYS_ENV == 'dev':
STATICFILES_FINDERS …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些代码来检查在DEBUG模式下是否存在静态文件,我无法使其正常工作.这是我在控制台中尝试过的内容:
>> from django.conf import settings
>>> settings.DEBUG
True
>>> from django.contrib.staticfiles.storage import staticfiles_storage
>>> staticfiles_storage.exists('img/vi_crumbs_bkg.gif')
False
Run Code Online (Sandbox Code Playgroud)
尽管vi_crumbs_bkg.gif存在于我的应用程序的静态目录中,但这仍然失败.如果我符号链接settings.STATIC_ROOT,它都按预期工作.
那么,staticfiles_storage.exists在DEBUG模式下,有什么方法可以开始工作吗?
(注意:虽然我知道我可以运行collectstatic以使其正常工作,但我讨厌在我积极开发时定期运行它来收集我所有应用程序中的所有资产)
提前致谢 -
所以我正在研究一个Django项目,并试图弄清楚如何让Javascript能够从我的静态目录中呈现图像.我已经修改了我的settings.py来从myproject/static加载静态文件(图像,js等),从myproject/templates加载我的模板.现在位于每个模板的顶部,我有以下几行:
{% load staticfiles %}
Run Code Online (Sandbox Code Playgroud)
这允许我在模板中加载这样的图像:
<img src="{% static "images/someImage.jpg" %}" width="65" height="36" alt="SomeImage"/>
Run Code Online (Sandbox Code Playgroud)
现在,这很好用 - 图像加载并在页面上按预期显示.但是我正在尝试这样做(好吧,无论如何,我的队友是):
<p><script src="{% static "js/getHeader.js" %}" type="text/javascript"></script></p>
Run Code Online (Sandbox Code Playgroud)
该行与上面两行在同一个文件中.getHeader.js文件:
var time = new Date();
var month = time.getMonth();
var day = time.getDate();
var year = time.getFullYear();
if (month == 1 & day == 23 & year == 2013) {
document.write('<img src="{% static "images/anotherImage.png" %}" width="680" height="210" />');
} else {
document.write('<img src="{% static "images/yetAnotherImage.png" %}" width="680" height="210"/>');
}
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,这个想法是在某个预定的日子打印一个不同的标题.我试图将任何图像/ html与渲染模板的Python代码分开,原因很明显,所以我不想只是将图像名称作为参数传递.代码本身运行正常,但是当加载页面时,会出现alt名称,但图像本身不会; 只是其中一个通用的空"图像未找到"框.
值得一提的是,如果我将这个Javascript内联到实际的HTML页面中,那么图像渲染就可以了.这也是在开发环境中,而不是生产 - 我将在后面处理这个问题.
是什么赋予了?我认为既然该行应该写入包含上述'load …
当我了解Django如何处理静态文件时,我已经看到了两种不同的方式来提供静态文件,同时仍然允许移植性.
一种方法是在模板中执行以下操作:
{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
Run Code Online (Sandbox Code Playgroud)
作为记录在这里的Django文档.
我看到的另一种方法是为静态文件加载上下文处理器,然后使用
<img src="{{ STATIC_URL }}images/hi.jpg" alt="Hi!" />
Run Code Online (Sandbox Code Playgroud)
作为注意到这里的Django文档.使用此方法时,我改变STATIC_URL基于
if DEBUG:
STATIC_URL = 'localhost'
else:
STATIC_URL = 'some_static_server_url'
Run Code Online (Sandbox Code Playgroud)这被认为是更好的做法?有一种方式比另一种更好吗?例如,这个 SO问题有两种方法作为答案,而这个方法有第二种方法.任何见解都会有所帮助.
我不知道我的虚拟主机django项目有什么问题,但简单的问题是无论我对这个文件做了什么修改仍然从apache输出相同的错误日志而不加载任何css或js文件,我能看到的是Apache正在根网页文件夹中查找静态和媒体文件: /var/www
[Fri May 30 00:58:08 2014] [error] [client 192.168.1.145] File does not exist: /var/www/static, referer: http://192.168.1.143/dgp/login/
Run Code Online (Sandbox Code Playgroud)
我按如下方式设置虚拟主机文件:
WSGIPythonPath /var/www/dgp_python2_7/bin/python2.7:/var/www/dgp_python2_7/lib/python2.7/site-packages
WSGIScriptAlias /dgp /var/www/dgp/dgp/dgp/wsgi.py
<VirtualHost 127.0.0.1:80>
ServerName www.dgp.dev
ServerAlias dgp.dev
AliasMatch ^/([^/]*\.css) /var/www/dgp/dgp/static/$1
Alias /media/ /var/www/dgp/dgp/media/
Alias /static/ /var/www/dgp/dgp/static/
Alias /images/ /var/www/dgp/dgp/images/
<Directory /var/www/dgp/dgp/static/>
Order deny,allow
Allow from all
</Directory>
<Directory /var/www/dgp/dgp/media/>
Order deny,allow
Allow from all
</Directory>
ErrorLog /var/www/dgp/dgp/error.log
CustomLog /var/www/dgp/dgp/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
而在settings.py STATIC_ROOT与'/var/www/dgp/dgp/static/'地方位于所有的CSS内容.
如何告诉apache或Django寻找正确的目录'/var/www/dgp/dgp/static/'?这让我发疯,我不明白在开发过程中如此元素如此复杂,以至于生产如此复杂.
问候!
使用解决方案进行编辑
真正的问题是我没有禁用Debian Apache的默认站点(这是我正在为之工作的版本)并且有另一种方法来保持虚拟主机,开始时我们必须使用follow命令禁用默认站点:a2dissite default和所有内容现在的作品就像一个魅力!
我不知道我是否混淆了目的collectstatic.这是我的设置模块:
# BASE_DIR is the location of my django project folder
STATIC_URL = '/this.static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "ve_static_root")
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "this.static"),
os.path.join(BASE_DIR, "this.media"),
)
MEDIA_URL = '/this.media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "ve_media_root")
Run Code Online (Sandbox Code Playgroud)
在这里,我放置了我的静态文件和媒体文件,STATICFILES_DIRS以便在我回忆/将图像嵌入到我的降价文档中时,可以使用媒体文件作为简单参考,但正如您所看到的,我为MEDIA_ROOT创建了一条路径,这需要与STATIC_ROOT不同.我担心的是,我把我的媒体文件夹,this.media中,在STATICFILES_DIRS文件夹中,这让我打电话给图像或视频到Django的使用这些staticfile过滤模板,像{% static 'image/file/path/here' %}.尽管如此,我还想知道如果所有文件,图像/视频和网页设计文件都进入STATIC_ROOT,MEDIA_ROOT的重点是什么?据我所知,Django没有collectmedia命令,所以我真的没有任何东西收集到MEDIA_ROOT文件夹中.我只是把它拿出来,空虚和所有.
我错过了这个吗?任何人都了解Django对此的看法?你的观点是什么?我不确定是否collectstatic应该涉及收集媒体文件,特别是当我有MEDIA_ROOT时.我查看了静态文件的文档,它们对于媒体文件确实不是很有帮助.
昨晚我决定将我的django学校项目投入生产.为此,我使用了Heroku.一切都很顺利,但"最后的触摸"让我发疯.它似乎没有看到我的静态文件,如网站上的bootstrap css'es,我不知道为什么因为例如ball.jpg被加载,管理员css也被加载.如果有人能找到我在过去10小时内处理的问题,那将是一个救生员:)
你可以在这里看到结果
我的settings.py
from django.conf import settings
if not settings.DEBUG:
import os
import dj_database_url
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '*****'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ["*"]
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Application definition
INSTALLED_APPS = (
'django.contrib.admin', …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用django-pipeline编译静态,但无法在dev模式下管理静态.由于我不是Django开发人员,我可能错误的是Django本身如何提供静态文件.这是我的项目结构:
因为我正在使用共享静态,所以我指定STATICFILES_DIRS了允许Django dev服务器和collectstatic命令查找共享静态的指令:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
Run Code Online (Sandbox Code Playgroud)
这是我的settings.py:
# for production, should be served via nginx
STATIC_ROOT= os.path.join(BASE_DIR, 'public/static/')
# prefix for static app
STATIC_URL = '/static/'
# also django-pipeline config
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'pipeline.finders.PipelineFinder',
)
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
PIPELINE = {
'PIPELINE_ENABLED': True,
'COMPILERS': ( …Run Code Online (Sandbox Code Playgroud) 我不认为这是重复的.我已经看了很多类似问题的答案.
请注意:这运行完全正常,django找到所有静态文件.
更新:看起来这是一个PyCharm错误.如果我将静态移动到我的app目录中,PyCharm可以解析它.但是,我在主src dir中有这个静态因为多个应用程序将使用CSS.现在它运行,Django对此没有任何问题.我觉得这是一个PyCharm错误.
PyCharm已经建立,其他一切似乎都与Pycharm提供的Django项目有关.
Pycharm无法解决,这意味着我无法使用自动完成,这很烦人.如果我点击ctrl-space,弹出的唯一目录是admin.这意味着PyCharm完全忽略了我的静态目录.
我也试过把它变成模板目录和资源总监.也没有运气.
{% load static %} <!-- {% load staticfiles %} -->
...
<link rel="stylesheet" href="{% static ''%}">
<link rel="stylesheet" href="{% static 'css/skeleton.css' %}">
<link rel="stylesheet" href="{% static 'css/custom.css' %}">
...
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.虽然PyCharm没有找到网址.
INSTALLED_APPS = [
'django.contrib.staticfiles',
# admin specific
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
'django.contrib.sessions',
]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_URL = '/static/'
Run Code Online (Sandbox Code Playgroud)
