我完全迷失了这个项目的最后一个步骤。
到目前为止,我已经能够开发一个Django应用程序,该应用程序可以按照我希望的方式在localhost上运行;我已经能够将网站部署到AWS EC2,但是必须缺少一些有关提供静态文件的基本知识。 (我什至还没有尝试过媒体文件。)我读过Django Deployment page和How-To管理static files,但是我从来没有从头开始部署过网站。我发现的教程似乎矛盾(或已过时?)。
这是我目前遇到的问题:
编辑
即使使用@DirkGroten的惊人的详细答案,我仍然没有得到如何提供静态文件的方法。我可以先运行服务器,然后再运行Web浏览器以查看没有静态文件的页面。但是,我现在遇到了一个新问题:在其上具有静态文件的页面将返回500 27错误(而它们过去仅对文件返回错误)。因此,这是我的文件夹结构,下面是我的设置文件的相关部分(该文件实际上分为基础,开发和生产)。
[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'
我已确保要在生产需求文件中导入白噪声。
我想念什么?
此外,我从未使用过AWS支持系统。 (我是免费会员。)这是我可以得到他们帮助的事情吗?我要开始案件吗?
TIA。
答案 0 :(得分:2)
首先您的问题:
collectstatic
在哪里可以找到静态文件,因此您应该拥有STATICFILES_DIRS
。此设置适用于一个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
目录中,白噪声将在其中获取它们以提供服务。每次文件更改时,您都会看到MD5哈希添加到文件名中,这是为了使浏览器能够获取新版本并且不使用缓存版本(Whitenoise告诉浏览器默认将静态文件缓存2年)。>
如果您可以使用它,请开始添加CDN(对其进行设置,以便从服务器中获取文件,whitenoise现在只需将每个文件提供给CDN一次,浏览器将从CDN中获取它);您需要更改STATIC_URL
来添加CDN的主机名(例如https://die9493v4034.cloudfront.net/static/
)。
然后将文件的位置从本地实例移动到共享存储(例如EFS)。