将 Django 部署到 AWS;傻瓜静态文件

2024-05-14

我对这个项目的最后一步完全迷失了。

到目前为止,我已经能够开发一个 Django 应用程序,它可以在本地主机上按照我想要的方式工作;我已经能够将网站部署到 AWS EC2,但我一定错过了有关提供静态文件的一些基本知识。 (我什至还没有尝试过媒体文件。)我已经阅读了 Django部署页面 https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/以及如何管理静态文件 https://docs.djangoproject.com/en/2.1/howto/static-files/,但我以前从未从头开始部署过网站。我发现的教程似乎是矛盾的(或过时的?)。

以下是我想我现在有的问题:

  1. Do I need在存储桶中托管静态(和/或媒体)文件,或者这仅仅是一个好主意?
  2. 当我设置 STATIC_ROOT 和 STATIC_URL 时,是否应该设置 STATICFILE_DIRS? (我的意思是,我认为我真的需要一个关于它们如何组合在一起、它们的设置以及“静态”在模板中如何工作的教程。)
  3. 我尝试过让白噪音运转起来;我收到一条消息,指出 STATIC_URL 设置不正确;我找不到文档来告诉我它应该是什么。这是一个可行的根吗?

EDIT

即使@DirkGroten 的答案非常详细,我仍然不知道如何提供静态文件。我可以运行服务器,然后通过网络浏览器查看没有静态文件的页面。但是,我现在遇到了一个新问题:包含静态文件的页面返回 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'

我已确保在生产需求文件中导入白噪声。

我缺少什么?

另外,我从未使用过AWS支持系统。 (我属于免费套餐。)这是我可以得到他们帮助的事情吗?我要立案吗?

TIA.


首先你的问题:

  1. 不,这是选项之一,但当您需要从多个 EC2 实例为站点提供服务时,使用集中式共享存储绝对是个好主意。 S3 是一种选择,我使用 EFS,我发现它更容易(见下文)。
  2. 是的,你需要告诉collectstatic在哪里可以找到静态文件,所以你应该有STATICFILES_DIRS.
  3. 是的,我喜欢白噪声,它与 CDN 结合使用效果很好。可以更轻松地不用担心过期/缓存标头。

我写了一个关于此的博客文章 https://www.dedi.co/blog/entries/2018/12/17/deploying-static-files-aws-django-part-1.

这是适用于一个 EC2 实例的设置:

  • 静态文件存储在 EC2 实例本地(EBS 卷上)->STATIC_ROOT设置(它们存储在哪里)
  • Whitenoise 提供静态文件并正确设置缓存头
  • CompressedManifestStaticFilesStorage作为存储(STATICFILES_STORAGE环境)
  • 最好使用 CloudFront 或其他 CDN 来提供静态文件 ->STATIC_URL环境。

最终,您需要集中存储静态文件,以便多个 EC2 实例可以访问它们(否则您必须在每台计算机上复制它们并确保清单文件同步),所以我自己的设置是:

  • 静态文件存储在由所有 EC2 实例安装和共享的 EFS 卷上(比 S3 更容易设置和使用,因为就 python 而言,它只是一个安装的磁盘)。我将 EFS 卷的挂载点设置为与STATIC_ROOT,因此无需更改设置。
  • 然后与上面相同:Whitenoise、CloudFront 和清单存储。

首先尝试让它在第一个设置中工作,执行以下操作:

  • STATIC_URL应该是将显示在 HTML 中的 URL。只是/static/应该与 WhiteNoiseMiddleware 一起使用,但如果您使用 CDN,则需要在其前面添加 CDN 实例的完整主机名。
  • STATICFILES_STORAGE我推荐应该是Whitenoise提供的存储之一CompressedManifestStaticFilesStorage.
  • STATICFILES_DIRS tells collectstatic它可以在其中找到要收集的静态文件。请注意,如果您只有静态文件/static每个应用程序内的目录,collectstatic会自动找到它们,您不应该在此处指定这些目录。如果你有一个/static目录在你的主项目目录中,你应该添加(os.path.join(BASE_DIR, "my_site", "static"),) to STATICFILES_DIRS where BASE_DIR (or PROJECT_ROOT在某些项目中)是项目的根目录。
  • STATIC_ROOT应该是磁盘上静态文件的物理位置。这是哪里collectstatic将复制它们并索引它们,从您的上一级开始BASE_DIR, i.e. 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)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Django 部署到 AWS;傻瓜静态文件 的相关文章

随机推荐

  • 为什么 { } 初始化需要 Add 方法?

    要使用这样的初始化语法 var contacts new ContactList Dan email protected cdn cgi l email protection Eric email protected cdn cgi l e
  • 将对象的值插入到span标签中

    我有一个对象 message text Here is some text 我想将它插入到一个跨度标签中 如下所示 span message text span 这不会打印 这是一些文本 而是只会在网页上显示 message text 我怎
  • 虚拟回调接口

    在 Eclipse 为您创建的来自 Google 的示例主从流代码中 片段中包含以下内容 private Callbacks mCallbacks sDummyCallbacks public interface Callbacks pub
  • 连接数组时合并两个 yaml 文档

    我想合并两个 yaml 文档 结果包含 所有映射值 最后一个优先 串联数组 例如给定这个文件 file1 yml animals elephant donkey flavours sour lemon sweet chocolate str
  • 仅当环境变量具有特定值时如何设置 Apache 标头

    我想在我的 Apache 2 4 配置中设置标头 但前提是环境变量具有特定值 SetEnv ENV NAME prod 我如何仅在以下情况下设置此标头ENV NAME is not prod Header set X Robots Tag
  • 如何使用放心的方式在正文中发送 JsonObject 以进行 post 请求?

    我有一个使用 Google Gson 创建的 JsonObject JsonObject jsonObj gson fromJson response1 json JsonElement class getAsJsonObject 我还对现
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 哪里可以找到可靠的 K-medoid(不是 k-means)开源软件/工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在学习 K medoids 算法 所以如果我提出不恰当的问题 我很抱歉 据我所知 K medoid
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • Paypal 付款标准默认输入卡详细信息

    我确信这个主题已经在这里了 但我刚刚与 Paypal 通电话 试图查明他们的帐户上是否有一个设置 可以让客户看到 输入卡详细信息区域 而不是自动 默认设置 引导您登录 注册您的 PayPal 帐户 Paypal 表示没有一个设置可以在他们这
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • IE 中的 Javascript 第 1 行语法错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人能找出这个第 1 行语法错误是什么吗 我正在尝试在 IE6 和 IE7 中进行调试 但找不到问题的根源 http ci elfster
  • WF 和分层状态机

    搜索 bing 和 google 我发现了一些关于与 Windows 工作流程相关的状态图的信息 但令人惊讶的是很少 我得出的唯一明确的答案是 是的 它可以处理状态图 这里有一个教程 但我想确定的是 Does it support hier
  • 循环中的knitr模板和子文档

    圣诞节前我之前问过跨多个 knitr 文档的单一样式表 https stackoverflow com questions 20370584 single style sheet across multiple knitr document
  • 使用 R 读取和转换二进制原始数据

    我有一个file https drive google com file d 0BxMpk0nhnJy6SFhxd2xuMzJYYlk edit usp sharing其中包含原始 二进制数据和 ascii 它包含一个时间戳和一个代表速度的
  • 如何使用特定版本的NPM?

    如何切换我正在使用的 npm 版本 现在 npm v 1 1 65 但我需要 1 0 x 我尝试过 但出现错误 npm version 1 0 npm ERR version No package json found 有人知道如何使用不同
  • C 静态代码分析器

    您使用哪种静态代码分析器 如果有 我一直在 Python 中使用 PyLint 我对它非常满意 现在我需要类似的 C 代码 为了正常的日常使用 您需要抑制多少输出 维基百科维护着一个静态代码分析工具列表 http en wikipedia
  • 监听 redux 动作

    我想创建一个可重用的 redux 表模块 它将存储和更新页码 显示的总页数等 我可以在所有页面之间共享这些模块 但是 我需要更新操作来触发刷新数据操作 该操作将根据页面到达不同的端点 因此 可能类似于页面特定的监听 RefreshData
  • 从 plist 文件中解码数据

    我丢失了在 Macbook Air 上用 Textwrangler 编写的文本文件中的一些数据 我在扩展名为 plist 的文件中找到了其中一些 文件是用 xml 编写的 如下所示
  • 将 Django 部署到 AWS;傻瓜静态文件

    我对这个项目的最后一步完全迷失了 到目前为止 我已经能够开发一个 Django 应用程序 它可以在本地主机上按照我想要的方式工作 我已经能够将网站部署到 AWS EC2 但我一定错过了有关提供静态文件的一些基本知识 我什至还没有尝试过媒体文