【问题标题】:Can I overwrite a static file dynamically using Django?我可以使用 Django 动态覆盖静态文件吗?
【发布时间】:2019-09-12 01:02:05
【问题描述】:

我正在建立一个 Heroku 站点来为一个学校项目部署一个 Django 应用程序。问题在于 Django 中使用白噪声的静态文件。

快速上下文:我的应用程序包含一个表单,该表单包含 4 个值,我用于在脚本中进行快速数学计算。该脚本的目的是执行计算,使用 matplotlib 绘制绘图并将其保存在我的 django 应用程序的静态文件夹中,如果它已经存在则替换旧的。此静态文件用于在站点的 html 页面中显示。每次我提交一个新表单时,它就像一个更新情节的魅力。但是当我尝试 Heroku 时,它会抛出一个

[Errno 2] 没有这样的文件或目录:'/Users/jeff/Desktop/trydjango/src/static/yield_curve.png'

当我提交表单时。

这是我关于静态文件的settings.py


STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

我的目录如下所示:

src
|-- /TER
|-- -- /settings.py
|-- /graph
|-- /static/...
|-- /staticfiles/... 
|-- /manage.py

我希望我的网站在每次使用我保存在静态文件夹中的新yield_curve.png 提交表单时刷新图像。 如果我不得不猜测,我会说这与静态文件必须是“静态的”并且不随时间变化的事实有关。

【问题讨论】:

  • 您能否发布您的 settings.py 文件的全部内容?
  • 问题不在于 Django,而在于 Heroku。你不能在 Heroku 的文件系统上持久保存东西。使用像 S3 这样的永久位置。
  • 谢谢,到时会进入!

标签: django python-3.x heroku


【解决方案1】:

我相信您无法使用免费/基本 Heroku 帐户保存/更新文件。静态文件必须保持静态和不变。几年前,我自己尝试在一个学校项目中做同样的事情。这是我将值传递给我的 JS 图表以动态呈现图形的方式,因此我不必使用文件:

views.py

def some_function(request):

# Do your calculations on the data here
data = [1,2,3,4] # Let's say this is the results
# Pass data in your context to the template
context = { "my_data" : data }

我的模板.html

<!-- Before including your JS file -->
<script> var my_passed_data = {{ my_data|safe }} </script>
<script "include your JS file (test.js in this example) which uses the my_passed_data to make a figure>

test.js

// Whatever library you use to render a chart will be here, I'm using CanvasJS for this example

var chart = new CanvasJS.Chart("chartContainer", {
** all your options, etc. **
data: [
{
** all the other stuff such as type, name, etc. **
dataPoints: [
    { x: 0, y: my_passed_data[0] }, // here is where you access your passed data by index
    { x: 2, y: my_passed_data[1] }, 

这就是我将数据从我的视图传递到模板到 JS 以使用 CanvasJS 呈现图表而不需要任何文件的方式。我不确定这是否是最好的方法,但它对我有用,希望这对你的学校项目有帮助并祝你好运!

【讨论】:

  • 也许您有文档来更好地理解您的意思?因为我的计算是在 python 脚本中完成的,我看不到如何将它渲染到 JS 图表(?)
  • OP 使用的是免费的测功机还是付费的测功机都没有关系。 Heroku 的文件系统在所有计划中都是短暂的。
  • @JérômeFares 我更新了我的答案,向您展示了我如何做到这一点的示例。希望它有所帮助,祝你好运。
【解决方案2】:

如果它已经存在,则将其保存在我的 django 应用程序的静态文件夹中替换旧文件夹

是的,这可以通过 Django 实现。不,这在 Heroku 上是不可能的,因为它有 ephemeral filesystem。您可以覆盖您的文件,但下次您的测功机重新启动时,该更改将丢失。这个happens frequently(每天至少一次)。

Heroku officially recommends 将用户上传和静态文件存储在 Amazon S3 等第三方服务上。 Whitenoise disagrees。您可以在 Heroku 上使用 Whitenoise,但您不能(持久地)修改静态文件而不重新部署。

请注意,无论您的测功机使用何种计划,这都是正确的。免费或企业,dyno 文件系统是短暂的。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2014-06-06
    • 2011-01-29
    • 2011-03-10
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多