Django - сохранить файл в статическом каталоге из представления

Я создаю веб-сайт с Django, размещенным на PythonAnywhere. Одна из страниц веб-сайта — это частная страница, которую я использую для создания контента, который затем будет отображаться на общедоступных страницах. Вместо того, чтобы сохранять контент, созданный на частной странице, в базу данных, а затем извлекать его из базы данных, я хотел бы сохранить его в статических файлах в моем статическом каталоге (это небольшое количество файлов JSON, которые будут обслуживаться снова и снова опять же, поэтому я думаю, что имеет смысл использовать их как статические файлы).

В представлении, которое определяет мою личную страницу, у меня есть следующий код для сохранения файла:

json=request.POST.get('json')
name=request.POST.get('name')
file=open(settings.STATIC_ROOT+'/'+name+'.json','w')
file.write(json)
file.close()

Обратите внимание, что я ранее импортировал настройки:

from django.conf import settings

Странно, какое-то время это работало, но потом перестало работать. Ошибка, которую я получаю:

Exception Value: 'function' object has no attribute 'STATIC_ROOT'

Я делаю что-то неправильно? Имеет ли значение тот факт, что я на PythonAnywhere? Возможно ли, что приложение обслуживается работником, который не может писать в мой статический каталог? Что я могу сделать, чтобы решить проблему?


person user4422    schedule 23.05.2015    source источник
comment
Предпочитаю использовать os.path.join в своем заявлении open. Также проверьте права доступа к своим папкам. Это работает на вашей машине разработки?   -  person Wtower    schedule 24.05.2015
comment
Я не использую машину для разработки, я работаю только онлайн. Что может быть не так, если не использовать os.path.join? Какие разрешения должны быть у статической папки?   -  person user4422    schedule 24.05.2015
comment
Вы должны использовать машину для разработки по множеству причин. os.path.join не решит вашу проблему, но это хорошая практика: stackoverflow.com/questions/13944387/ Что касается разрешений, обычно оно должно быть доступно только для чтения, но для вашего конкретного случая, очевидно, вам требуются права на запись.   -  person Wtower    schedule 24.05.2015
comment
Разрешения следующие: rwxrwxr-x   -  person user4422    schedule 24.05.2015
comment
Статические файлы делаются статическими. Почему нельзя загрузить в папку media?   -  person sobolevn    schedule 24.05.2015
comment
Здесь разработчик PythonAnywhere — звучит так, будто все должно работать. Ваше приложение обслуживается работником, работающим под вашим собственным идентификатором пользователя, поэтому у него должны быть разрешения на запись в каталог.   -  person Giles Thomas    schedule 24.05.2015
comment
Только что заметил -- Exception Value: 'function' object has no attribute 'STATIC_ROOT' предполагает, что переменная settings в вашем вызове open была заменена функцией. У вас есть код, который определяет функцию с именем settings между импортом и открытием?   -  person Giles Thomas    schedule 24.05.2015
comment
В этом была проблема. У меня было представление, которое также называлось settings, что и создало конфликт. Теперь я собираюсь опубликовать предложенное решение, которое, похоже, работает.   -  person user4422    schedule 24.05.2015


Ответы (1)


Как указали сотрудники PythonAnywhere, процедура была законной и должна была работать, потому что приложение обслуживается работником, работающим под моим собственным идентификатором пользователя, у которого есть разрешения на запись в статический каталог. Проблема возникла из-за конфликта имен из-за того, что одно из представлений также было названо settings. Чтобы решить проблему, я заменил оператор импорта на

from django.conf import settings as django_settings
import os

и открытое заявление с

file=open(os.path.join(django_settings.STATIC_ROOT, f'game_{name}.json'),'w')

После этих замен вроде все заработало.

person user4422    schedule 24.05.2015
comment
В моем случае у меня есть ошибка FileNotFoundError: [Errno 2] Нет такого файла или каталога, когда я использую ваш код. Пожалуйста, любое решение. - person GSandro_Strongs; 20.05.2021