这可能是一个愚蠢的问题,但它并没有点击我的脑袋.
在Django中,惯例是将您的应用程序特有的所有静态文件(即css,js)放入名为static的文件夹中.所以结构看起来像这样:
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
Run Code Online (Sandbox Code Playgroud)
在mysite/settings.py我有:
STATIC_ROOT = 'staticfiles'
Run Code Online (Sandbox Code Playgroud)
所以当我运行命令时:
python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)
它在根级别创建一个名为staticfiles的文件夹(与myapp /目录相同)
这有什么意义?是不是只创建了我所有静态文件的副本?
我正在尝试将一个Django应用程序部署到Heroku,它开始构建,下载和安装所有内容,但这就是我在收集静态文件时所获得的
$ python manage.py collectstatic --noinput
remote: Traceback (most recent call last):
remote: File "manage.py", line 10, in <module>
remote: execute_from_command_line(sys.argv)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
remote: utility.execute()
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
remote: self.fetch_command(subcommand).run_from_argv(self.argv)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
remote: self.execute(*args, **cmd_options)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
remote: output = self.handle(*args, **options)
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 168, in handle
remote: collected = self.collect()
remote: File "/app/.heroku/python/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 98, in collect
remote: …
Run Code Online (Sandbox Code Playgroud) 在django 1.7中,collectstatic为我抛出一个例外:
OSError: [Errno 2] No such file or directory: '/static'
Run Code Online (Sandbox Code Playgroud)
我已经执行了很多collectstatic
调用,一切正常,但今天有这个问题.
settings.py
BASE_DIR = os.path.dirname(os.path.realpath(__file__))
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'fxblog',
'rest_framework',
)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, STATIC_URL.strip("/"))
STATICFILES_DIRS = (
'/static/',
'/upload/',
)
Run Code Online (Sandbox Code Playgroud)
BASE_DIR是正确的,检查它.目录BASE_DIR/static/exists以及我的所有静态文件.
追溯:
Traceback (most recent call last):
File "../manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File …
Run Code Online (Sandbox Code Playgroud) 我正在使用boto和S3存储我的Django站点的静态文件.当使用该collectstatic
命令时,它会在停止文件并投掷之前完美地上传大量文件."Error 32: Broken Pipe."
当我尝试再次运行该命令时,它会跳过它已经上传的文件并从它停止的文件开始,之前没有上传任何新内容就抛出相同的错误.
使用 nginx、gunicorn、django 和 virtualenv 在数字海洋上的服务器上部署后,我尝试使用 collectstatic:
python manage.py collectstatic --settings=config.settings.production
Run Code Online (Sandbox Code Playgroud)
如您所见,我有多个设置文件。一份基地,一份本地和一份生产设置文件。下面是错误:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 173, in handle
if self.is_local_storage() and self.storage.location:
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 239, in inner
return func(self._wrapped, *args)
File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__ …
Run Code Online (Sandbox Code Playgroud) 我一直在移动一些设置来制作更明确的本地和生产环境,我一定是搞砸了。
以下是大部分相关设置。如果我将 production.py 设置(目前只包含与 AWS 相关的设置)移动到 base.py,我可以从我的本地机器更新 S3 就好了。同样,如果我将这些 AWS 设置保留在 base.py 中并推送到生产环境,S3 会相应地更新。另外,如果我从 production.py 打印一些东西,它会打印。但是,如果我在 manage.py 上将 production.py 设为我的“本地”设置,或者当我使用如下所示的设置推送到 Heroku 时,S3 不会更新。
我的设置不正确怎么办?(嗯,我确定一些事情,但特别是导致 S3 不更新?)
这是一些相关的代码:
__init__.py
(在包含 base、local 和 production 的目录中)
from cobev.settings.base import *
Run Code Online (Sandbox Code Playgroud)
base.py
INSTALLED_APPS = [
...
'whitenoise.runserver_nostatic',
'django.contrib.staticfiles',
...
'storages',
]
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "global_static"),
os.path.join(BASE_DIR, "media", )
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
local.py
# local_settings.py
from .base import *
...
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)
production.py
from …
Run Code Online (Sandbox Code Playgroud) 在阅读了大量文档后,我仍然没有很好地掌握到底什么是静态文件与用户上传的文件......或者静态文件到底是什么。
1.静态文件
Django将静态文件描述为“图像、javascript、css”之类的东西。好的,有道理。但是所有那些 .py 文件和 .html 模板文件等等……它们不是静态的??当站点运行时,它们不会“改变”。究竟什么是静态文件?“提供静态文件”是什么意思?这与“提供”“views.py”文件或“home.html”文件有何不同?
最重要的是,为什么我什至需要“collectstatic”?为什么我所有的静态文件都需要在一个地方?我想如果你使用一个单独的网络服务器来“服务”它们,那是有道理的......仍然,不确定这到底是什么意思。
另外,无论如何,“collectstatic”去哪里找到所有假定的静态文件?它会检查我的所有代码并查看我访问图像/javascript 文件的位置吗?
2. 用户上传的文件
假设我只是从表面上看这个静态的东西,如果用户上传图片会发生什么?我是否需要一个在后台不断运行“collectstatic”的程序?
Django将媒体文件描述为管理用户上传内容的一种方式。老实说我还没有尝试过这个(现在会这样做),但这仍然代表一个问题:如果将所有“静态”文件放在一个地方如此重要,为什么突然可以不对用户这样做 -上传的文件?
这个“MEDIA_ROOT”目录中的文件不是由“collectstatic”收集的吗?如果我只是把我所有的图像/javascript/css 放到这个媒体文件夹中怎么办?然后什么都不收集?有什么问题吗?
感谢任何人对此的见解。
编辑:
我发现import django_heroku
从我的 settings.py 文件中删除允许我将我的静态文件推送到我的 AWS 存储桶。当我取消注释时import django_heroku
,collectstatic
然后将我的文件推送到staticfiles
文件夹。
manage.py collectstatic
与#import django_heroku
:
您已请求在设置中指定的目标位置收集静态文件。
maange.py collectstatic
与import django_heroku
:
您已请求在设置中指定的目标位置收集静态文件:/path/to/project/staticfiles
我不知道这是为什么或如何解决它。现在的问题是:如何在 Heroku 上为我的 django 应用程序运行 collectstatic?还是我需要用 nostatic 运行我的 heroku 实例?(例如runserver --nostatic
)
问题:
每当我运行时,我python manage.py collectstatic
所有的静态文件都被放置到本地的“staticfiles”文件夹中。STATICFILES_STORAGE = myapp.aws.utils.StaticRootS3Boto3Storage
但是我已经设置了文件总是转到“myapp/staticfiles”。
设置.py:
AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_FILE_EXPIRE = 200
AWS_PRELOAD_METADATA = True
AWS_QUERYSTRING_AUTH = True
DEFAULT_FILE_STORAGE = 'myapp.aws.utils.MediaRootS3Boto3Storage'
STATICFILES_STORAGE = 'myapp.aws.utils.StaticRootS3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME') …
Run Code Online (Sandbox Code Playgroud) 使用dokku部署Django应用程序时出现以下错误
Collectstatic configuration error. To debug, run:
$ heroku run python ./manage.py collectstatic --noinput
Run Code Online (Sandbox Code Playgroud)
我发现无法运行heroku run python ./manage.py collectstatic --noinput
dokku容器,但是当我尝试时dokku run my app python ./manage.py collectstatic --noinput
,静态文件已成功复制到该STATIC_ROOT
文件夹,并且没有给出错误消息.
我可以通过将collectstatic
命令放入Procfile
以下内容来解决问题:
web: python manage.py collectstatic --noinput ; gunicorn myapp.wsgi
Run Code Online (Sandbox Code Playgroud)
不过,我很想知道导致问题的原因以及如何进行调试.有任何想法吗?
我目前有两种文件静态文件和媒体文件.静态文件包含我的css,js和其他静态内容.媒体文件包含用户上传的内容.静态文件夹就在媒体文件夹旁边.现在在我部署的计算机上.如果我设置DEBUG = False
我的静态文件很好,但我的媒体内容永远不会显示.我收到一个404 not found
错误.我的问题是当DEBUG = False时如何在生产环境中显示媒体内容.有了DEBUG = True,一切似乎都运行正常吗?我阅读了以下页面并尝试了这些内容.
1-Tried为静态媒体创建一个单独的文件夹,就像静态内容一样.
目前,我的静态内容由collectstatic
命令管理.我在webfaction上使用apache.我有一个静态文件夹,static_content
当我./manage.py collectstatic
在静态文件夹中运行我的所有内容时被static_content
调用复制到该文件夹.我尝试创建另一个名为的静态文件夹static_media
.但是,当我运行./manage.py collectstatic
我的media
文件夹的内容被复制到,static_content
而不是static_media
它应该有.谁能告诉我为什么collectstatic命令没有粘贴内容static_media
呢?
这就是我的配置
ALLOWED_HOSTS = [
"*",
'mywebsite.com',
'www.mywebsite.com.com',
]
STATIC_URL = 'http://mywebsite.com.com/static/'
STATIC_ROOT = '/home/admin/webapps/static_content'
STATICFILES_DIRS = (
'/home/admin/webapps/mainfolder/mainapp/static',
'/home/admin/webapps/mainfolder/mainapp/media',
)
PROJECT_PATH = os.path.join(BASE_DIR, 'static')
MEDIA_URL = 'http://mywebsite.com.com/media/'
MEDIA_ROOT = '/home/admin/webapps/static_media'
Run Code Online (Sandbox Code Playgroud)
这就是我的urls.py看起来像
admin.autodiscover()
urlpatterns = [
....
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)
我是否正在使用正确的方法创建一个单独的文件夹来管理我的媒体内容,就像DEBUG = …
collectstatic ×10
django ×10
python ×7
amazon-s3 ×3
heroku ×3
static ×2
boto ×1
deployment ×1
dokku ×1
gunicorn ×1
media ×1
nginx ×1
static-files ×1