#48. Загрузка (upload) файлов на сервер. Классы FileField и ImageField | Уроки по Django 4
ฝัง
- เผยแพร่เมื่อ 17 ต.ค. 2024
- Практический курс по Django: stepik.org/a/1...
Телеграм-канал Django: t.me/django_se...
Инфо-сайт: proproprogs.ru...
Создаем форму загрузки файлов на сервер. Классы полей формы FileField и ImageField фреймворка Django.
48_sitewomen.zip: github.com/sel...
Загрузка файлов: docs.djangopro...
Спасибо, Сергей! Здоровья тебе🤝
Это просто бесценно, спасибо что делитель с нами
Конечно есть много вопросов, по ньансам.
Спасибо, все пашет! 🚜
Спасибо. Интересно.
Услышав про домашнее задание, принялся фантазировать. Вот, что получилось:
....
import time
.....
def handle_uploaded_file(f):
with open(f'uploads/{time.strftime("%d_%m_%Y_at_%Hч%Mм%Sс")}_{f.name}',
'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
Я использую тут модуль time у которого есть strftime, принимающий строку, задающую формат отображения текущего времени и даты. В моем случае, при каждом сохранении, в название файла, перед f.name добавляется:
день_месяц_год_at_час_минут_секунд
Т.е., если сохранять не чаще, чем раз в секунду, то каждый новый файл будет с уникальным названием и не будет повторяться и перезатираться.
Нужно опцию добавить in memory через модуль io для хранения временных файлов в сессии пользователя. Если например у нас будет инженерная программа для расчетов, и нужно будет загрузить исходные данные
Спасибо!
Хорошим вариантом уникального имени для большого потока файлов будет
import time
name = round(time.time() * 1000)
Захотел изменить имя файла через datetime, что вполне логично.
Но забыл проверить пунктуацию выводящейся из datetime инфы. Долго не мог понять что же я не так делаю. А все точка и двоеточия =)
не получается открыть Evaluate Expression. В консоли POST запрос виден, все нормально, код 200, а в Debugger ничего не видно в режиме отладки. Что у меня не так?
Тоже так было. Переделал все заново - заработало. Так и не понял, где была ошибка
Тоже самое не вижу ничего. Что по итогу нужно сделать?
И у меня так было, просто все презапустил, со страницы ушел, вернулся и все ОК!
👍
Сергей добрый вечер, скажите пожалуйста я человек который посмотрел все видео по django3. Какие видео мне нужно и стоит посмотреть по django4?
Я бы рекомендовал посмотреть весь курс + курс на Stepik.
@@selfedu_rus вы уверены что это не будет пустая трата времени?
@@whoami866 нет, там много нового, а старое можно промотать
Планируется ли курс по Kivy?
пока нет
А что нужно чтобы посмотреть оставшиеся 24 недоступных видео?
Открываются через день. Либо приобрести курс по Django (ссылка под видео) + плюс некоторые дополнительные видео.
Я реализовал уникальность имени файла через uuid (4 тип, он типа не использует ваш мак адрес и секретней 😃).
В начале имени файла присвоил пять сиволов и дефис.
Выглядеть будет примерно так 53c58-ИмяФайла.jpg.
Мне не нравится так, хотел бы ИмяФайла-53c58.jpg, но, если я меняю, то у меня получается ИмяФайла.jpg-53c58.
def random_5_characters_for_filename() -> str:
'''
Генерирую рандомную последовательность из пяти символов.
Использую UUID (универсальный уникальный идентификатор).
Объект UUID-в строку-в список-срез-джойню в строку-удаляю запятые
'''
return ','.join(list(str(uuid.uuid4()))[-5:]).replace(',', '')
def handle_uploaded_file(f):
'''
Фун-я для загрузки файла.
К имени фото, в начале прикреплю пять рандомных символов
'''
with open(f"uploads/{random_5_characters_for_filename()}-{f.name}", "wb+") as destination:
for chunk in f.chunks():
destination.write(chunk)
def about(request):
'''О сайте'''
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
# 'file' - птмчт в UploadFileForm так назвал
handle_uploaded_file(form.cleaned_data['file'])
else:
form = UploadFileForm()
return render(
request,
'women/about.html',
{'title': 'О сайте', 'menu': menu, 'form': form}
)
>Мне не нравится так, хотел бы ИмяФайла-53c58.jpg, но, если я меняю, то у меня получается ИмяФайла.jpg-53c58.
Можно сплитануть имя файла на непосредственно имя и расширение:
file_n, file_e = f.name.split('.')
f'uploads/{file_n}_{str(uuid4())[:5]}.{file_e}'