我完全迷失在这个项目的最后一步。
到目前为止,我已经能够开发一个django应用程序,它按照我想要的方式在localhost上运行;我已经能够将网站部署到AWS EC2,但我必须遗漏一些关于提供静态文件的基本知识。 (我还没有尝试过媒体文件。)我已经阅读了Django Deployment page和How-To管理static files,但我之前从未部署过网站。我发现的教程似乎是矛盾的(或过时的?)。
以下是我认为我现在的问题:
编辑
即使使用@DirkGroten非常详细的答案,我仍然没有得到如何提供静态文件。我可以运行服务器,然后运行Web浏览器以查看没有静态文件的页面。但是,我现在有一个新问题:在它们上面有静态文件的页面返回500 27错误(而它们用于仅返回文件的错误)。所以,这是我的文件夹结构,下面是我的设置文件的相关部分(实际上分为base,dev和prod)。
[mainsite]/
|---[mainsite]/
| |---[settings]/
| |---base.py
| |---dev.py
| |---prod.py
|---[app1]/
| |---[migrations]
| |---[static]/
| | |---[app1]/
| | | |---app1_file1.jpg (etc)
| | |---app1_style.css
| |---[templates]/
| | |---[app1]/
| | |---about.html (etc)
|---[app2]/ (etc)
|---[static] (this gets populated after running collectstatic)
开发设置:
Debug = False
ALLOWED_HOSTS = [###.###.###.###]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
... (the rest of the middleware)
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, 'static'))
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'app1/'),
os.path.join(BASE_DIR, 'app2/'),
os.path.join(BASE_DIR, 'app3/'),
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
我确保我在生产要求文件中导入whitnoise。
我错过了什么?
此外,我从未使用AWS支持系统。 (我在免费等级。)这是我能得到他们帮助的事情吗?我开个案了吗?
TIA。
首先你的问题:
collectstatic
在哪里找到静态文件,所以你应该有STATICFILES_DIRS
。我写了一个blog post about this。
这是一个适用于一个EC2实例的设置:
STATIC_ROOT
设置(它们存储在何处)CompressedManifestStaticFilesStorage
作为存储(STATICFILES_STORAGE
设置)STATIC_URL
设置。最终,您需要集中存储静态文件,以便多个EC2实例可以访问它们(否则您必须在每台计算机上复制它们并确保清单文件同步),因此我自己的设置是:
STATIC_ROOT
相同的位置,因此设置中无需更改。首先尝试使用第一个设置,执行以下操作:
STATIC_URL
应该是将在HTML中显示的URL。只有/static/
应该与WhiteNoiseMiddleware一起使用,但如果您使用CDN,则需要在其前面加上CDN实例的完整主机名。STATICFILES_STORAGE
应该是Whitenoise提供的存储之一,我推荐CompressedManifestStaticFilesStorage
。STATICFILES_DIRS
告诉collectstatic
它可以找到要收集的静态文件。请注意,如果您在每个应用程序内的/static
目录中只有静态文件,collectstatic
会自动找到它们,您不应在此处指定这些目录。如果主项目目录中有/static
目录,则应将(os.path.join(BASE_DIR, "my_site", "static"),)
添加到STATICFILES_DIRS
,其中BASE_DIR
(或某些项目中的PROJECT_ROOT
)是项目的根目录。STATIC_ROOT
应该是磁盘上静态文件的物理位置。这是collectstatic
将复制它们并将它们编入索引的地方,从你的BASE_DIR
开始,即os.path.abspath(os.path.join(BASE_DIR, '../static'))
现在每次更新代码和静态文件时,都应该运行django-admin collectstatic
。这会将所有静态文件复制到STATIC_ROOT
目录,在该目录中,whitenoise将获取它们以便为它们提供服务。每次文件更改时,您都会看到MD5哈希添加到文件名中,这样浏览器就会获取新版本并且不使用缓存版本(Whitenoise告诉浏览器默认情况下缓存静态文件2年)。
如果你让它工作,开始添加CDN(设置它以便从你的服务器获取文件,现在只需将每个文件服务一次到CDN,浏览器将从CDN获取它);你需要改变STATIC_URL
来添加CDN的主机名(例如https://die9493v4034.cloudfront.net/static/
)。
然后将文件的位置从本地实例移动到共享存储(例如EFS)。