Могу ли я перезаписать статический файл динамически, используя Django? - PullRequest
0 голосов
/ 23 апреля 2019

Я настраиваю сайт Heroku для развертывания приложения Django для школьного проекта.Проблема в статических файлах, использующих whitenoise в 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, которую я сохранил в статической папке.Если бы мне пришлось угадывать, я бы сказал, что это связано с тем, что статические файлы должны быть «статичными» и не изменяться со временем.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

и сохраните его в статической папке моего приложения django, заменив старую, если она уже существует

Да, это возможно с Джанго. Нет, это невозможно на Heroku из-за ее эфемерной файловой системы . Вы можете перезаписать свои файлы, но это изменение будет потеряно при следующем перезапуске dyno. Это происходит часто (хотя бы раз в день).

Heroku официально рекомендует для хранения пользовательских загрузок и статических файлов в сторонних сервисах, таких как Amazon S3. Уайтенуаз не согласен . Вы можете использовать Whitenoise в Heroku, но вы не можете (постоянно) изменять статические файлы без повторного развертывания.

Обратите внимание, что это верно независимо от плана, который используют ваши динамометры. Свободные или корпоративные файловые системы dyno эфемерны.

0 голосов
/ 23 апреля 2019

Я считаю, что вы не можете сохранять / обновлять файлы с помощью бесплатной базовой учетной записи 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 }

my_template.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 и без каких-либо файлов. Я не уверен, что это лучший способ, но он работает для меня, надеюсь, это поможет и удачи в вашем школьном проекте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...