Flask #17: Загрузка файлов на сервер и сохранение в БД

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 พ.ค. 2020
  • Инфо-сайт: proproprogs.ru
    Принцип загрузки файлов на сервер через форму на примере загрузки изображений аватара пользователя и сохранение их в БД.
    Проект flasksite: github.com/selfedu-rus/flasks...

ความคิดเห็น • 48

  • @ms-33
    @ms-33 4 ปีที่แล้ว +7

    Спасибо! Ваши уроки великолепны!

  • @rustamakhmullaev5697
    @rustamakhmullaev5697 4 ปีที่แล้ว +5

    Спасибо за интересный урок!!! отдельное большое спасибо за исходники!!!

  • @just_nekr
    @just_nekr ปีที่แล้ว +5

    Смотрю ваши великолепные уроки и задаюсь вопросом, а за что я вообще деньги в гикбрейнс отдал год назад

  • @donfedor007
    @donfedor007 3 ปีที่แล้ว +2

    Полезная тема!!! Спасибо Вам!!!

  • @userqh67vey6
    @userqh67vey6 ปีที่แล้ว +2

    У фласка есть уязвимость при загрузке файлов. На Hack The Box есть задача с уязвимым компьютером "OpenSource", там как раз сайт на Flask и можно потренироваться. Также есть уязвимость с подбором pin-а для удаленного дебагера. Собственно с Hack The Box я попал сюда на эти уроки.
    Лайк за видео!

    • @orthodox-chanel
      @orthodox-chanel ปีที่แล้ว

      а есть способы защититься от этой уязвимости?

    • @user-qn8zd2tq9v
      @user-qn8zd2tq9v ปีที่แล้ว +1

      @@orthodox-chanel Не ясно, что именно имел в виду комментатор, но возможно, уязвимость связана с сохранением файлов, которые загружает пользователь, в файловую систему. Чтобы от нее защититься, нужно использовать функцию werkzeug.utils.secure_filename(filename: str) -> str, которая возвращает безопасное имя файла. Автор ролика про эту функцию не сказал, но и в уроке файл сохраняется в базу данных, поэтому ее не нужно было использовать.

  • @orthodox-chanel
    @orthodox-chanel ปีที่แล้ว +3

    если работаете с постгрес и фото не хочет отображаться то нужно его преобразовать в байтовый вид таким образом img = self.__user['avatar'].tobytes(), я на этом моменте долго топтался

    • @user-yg6sp8pb4q
      @user-yg6sp8pb4q 6 หลายเดือนก่อน

      Спасибо тебе, добрый человек!

  • @nadyamoscow2461
    @nadyamoscow2461 3 ปีที่แล้ว +1

    Большое спасибо. ps Аватарки у вас симпатичные

  • @Morfeus681
    @Morfeus681 ปีที่แล้ว

    Спасибо огромное за уроки!! У меня вопросик, подскажите... если работать с js и ajax, т.е. чтобы не перегружать страницу, как это можно сделать и как быть с передачей результата SQL запроса в шаблон?

  • @vladislavkachaev6507
    @vladislavkachaev6507 3 ปีที่แล้ว +2

    Спасибо вам за огромный вклад. Помните пожалуйста можно ли данный пример (сайт блог) залить на хостинг и использовать бд скюлайт и flask? Или это невозможно? Где это можно тогда применить и как реализовать сайт на питоне с бд?

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว

      Как пример, хостинг foxit.com позволяет использовать Flask в качестве бэкэенда. Достаточно написать в службу поддержки, вам все конкретно разьяснят.

  • @user-hn7gb9ej9d
    @user-hn7gb9ej9d 4 ปีที่แล้ว +2

    Спасибо!

  • @delay_gryaz_chisto
    @delay_gryaz_chisto 4 ปีที่แล้ว +6

    а не проще ли сделать поле аватаркой в бд путем к картинке, картинки грузить в файловую систему, и при создании пользователя применять дефолтный линк ‘/images/default.png’? а когда пользователь загрузит новый аватар, положить его в папку ‘images/users/1.png’, и в базе прописать путь к нему? а в шаблон отдавать путь к картинке. во-первых база будет меньше напрягаться(передать бинарник != передать строку), во-вторых, тем самым, если у нас будет 500 пользователей, будет всего 1 картинка, к которой они все будут ссылаться. в какой-то мере DRY
    плюс, насколько я знаю, хранить бинарные файлы в базе данных - плохая практика.
    это лишь мое предложение. спасибо вам за ваши труды. очень доступно объясняете.

    • @selfedu_rus
      @selfedu_rus  4 ปีที่แล้ว +6

      Спасибо, хороший вопрос. Лично я так и делаю в сайтах - через путь к файлу. Но если это всего лишь небольшая по объему аватарка, которая уникальна для каждого пользователя, то можно и в БД засунуть. И плюс, я хотел показать как вообще картинки можно сохранять и читать из БД на конкретном примере.

    • @artemkhmil
      @artemkhmil 3 ปีที่แล้ว

      Отличный комментарий. У меня вопрос: если реализовать все Вами выше указанное, то как удалять фотографии старых аватаров в папке /image/users?

    • @delay_gryaz_chisto
      @delay_gryaz_chisto 3 ปีที่แล้ว +2

      @@artemkhmil можно написать скрипт, который будет запускаться раз в месяц, и проходиться по всем файлам в папке, и, если файла нет в бд, - удалять его. вообще не проблема. куда лучшее решение, чем хранить миллион одинаковых бинарников в бд)

    • @7volaner7
      @7volaner7 3 ปีที่แล้ว

      @@selfedu_rus Вот зря! Не надо учить людей изобретать велосипеды!

  • @Jiligriv
    @Jiligriv 2 ปีที่แล้ว

    Очень странные баги у себя отлавливаю - не грузится свой аватар. Дважды пересмотрел ролик перепроверил каждую строчку написанного кода. Взял ваш profile.html и вставил вместо своего, всё заработало. Из отличий только то, что в {{url_for('upload')}} и {{url_for('logout')}} между двойными фигурными скобками у меня были пробелы (вот так {{ url_for('logout') }}). Из-за этого действительно могло не работать?

  • @yarik83men51
    @yarik83men51 3 ปีที่แล้ว +1

    Спасибо

  • @user-tj4we7hk9d
    @user-tj4we7hk9d 4 ปีที่แล้ว +3

    Крутооооооо

  • @user-lk4jx9sn9t
    @user-lk4jx9sn9t 2 ปีที่แล้ว +1

    Вот так вот ребята это делается в самом простом варианте)))

  • @user-ji6df1ei2c
    @user-ji6df1ei2c 2 ปีที่แล้ว +1

    Скажите пожалуйста почему в f-строках сразу нельзя писать обращение к базам данных вставляя переменные в {} кавычки. В прошлых видео встречал в комментах упоминания про SQL инъекции. Видимо это связано с безопасностью. Можете в кратце пояснить или дать наводку, где можно почитать про это) Потому что пока "не бум бум", а узнать хотелось бы. Спасибо =)

    • @selfedu_rus
      @selfedu_rus  2 ปีที่แล้ว +5

      Да, сразу не рекомендуется, т.к. в GET-запросе тогда можно будет прописать обращение к БД и сделать нехорошие вещи. Поэтому, нужно в SQLite использовать символы ? - они предотвращают этот момент.

  • @Andredy89
    @Andredy89 4 ปีที่แล้ว +1

    все здорово. Но как это потом в инет то все загрузить?

  • @aliaksandrzabalotnikau1948
    @aliaksandrzabalotnikau1948 3 ปีที่แล้ว +1

    Привет, учусь по твоим курсам но использую mysql и в коннекторе к python не могу найти такую функцию Binary как у тебя в sqlite. Может есть возможность прочитать загруженный файл сразу в бинарный код используя какой-то другой способ?

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว

      Бинарный файл иначе загружать получится только извратом, лучше разобраться, почему нет такой функции. Она стандартная пакета sqlite3. Вначале должен идти импорт (import sqlite3), а затем, обращение к этой функции. Посмотрите, есть ли этот импорт в файле и второе, попробуйте поставить последнюю версию sqlite3.

    • @aliaksandrzabalotnikau1948
      @aliaksandrzabalotnikau1948 3 ปีที่แล้ว +3

      Я использую mysql вместо sqlite3) В общем сделал немного по другому. У файла, который получаем из объекта запроса есть метод save, который позволяет сохранить этот файл на компе(сервере). В общем благодаря этому методу сохраняю загруженный файл, а потом читаю его в бинарном режиме и отправлю в БД(mysql) уже в бинарном виде. Правда не знаю насколько это хорошая практика, ведь теперь файл сохранён и там и там и по идеи используется больше места. Думаю прикрутить автоматическое удаление с компа после добавления в БД с использованием потока) Получится такой маленький буфер))
      P.s Мне кажется я написал это для себя, что бы лучше въехать в то, что я нагородил у себя в коде. И спасибо за уроки!!

  • @TSM_149
    @TSM_149 ปีที่แล้ว +1

    Спасибо за ролик!
    Вот только не понял зачем отдельно делать "открыть файл", а потом "загрузить". Не лучше ли сделать "изменить аватар", и всё выполнить одной операцией - открыть файл и загрузить?
    P.S.
    Ещё нарвался на проверку, что имя пользователя должно быть больше 4 (четырёх) символов
    ...
    len(request.form['name']) > 4 and len(request.form['email']) > 4
    ...
    🤦‍♂.
    Ввожу имя "Иван", а регистрация не проходит 😁

    • @dmitriydolgopolov5212
      @dmitriydolgopolov5212 ปีที่แล้ว

      Так ведь "Иван" содержит 4 символа. А по условию проверки должно быть больше 4.

  • @Gree_ok
    @Gree_ok ปีที่แล้ว +1

    Почему для загрузки фото профиля нужен обработчик? Почему нельзя просто загрузить фото из БД, как имя или почту?

    • @selfedu_rus
      @selfedu_rus  ปีที่แล้ว

      Насколько я помню, там нужно еще загружать графический файл на сервер, за это обработчик и отвечает.

  • @arnowt
    @arnowt 3 ปีที่แล้ว +3

    Зачем вы удаляете таблицу, вместо того чтобы модифицировать?

    • @AnnaIsHere
      @AnnaIsHere 2 ปีที่แล้ว

      Мне тоже интересно как быть, когда сайт уже работает и понадобилось что-то добавить в базу. Не удалять же.

    • @just_nekr
      @just_nekr ปีที่แล้ว

      @@AnnaIsHere есть дополнительная библиотека Flask_Migrate как раз для подобных вещей

  • @network_sw
    @network_sw ปีที่แล้ว +1

    Еще бы урок по скачиванию файлов из веб-приложения на Flask...

  • @ShDShD-sv6yx
    @ShDShD-sv6yx 7 หลายเดือนก่อน +1

    Автор про константу 3 минуты рассказывал, а функции пролетел как будто переменные какие-то.

  • @lastmorning9409
    @lastmorning9409 ปีที่แล้ว

    4-20 лайков. не буду портить, оставлю коммент просто

  • @vladrask
    @vladrask 3 ปีที่แล้ว

    не нашел класс profile-table в css

    • @selfedu_rus
      @selfedu_rus  3 ปีที่แล้ว +1

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

    • @nazarkhort4362
      @nazarkhort4362 3 ปีที่แล้ว

      @@selfedu_rus profile-table нету даже там. видимо поэтому у меня не отображает аватар

    • @nazarkhort4362
      @nazarkhort4362 3 ปีที่แล้ว

      @@selfedu_rus обидно, поскольку я прошел 17 уроков

    • @nazarkhort4362
      @nazarkhort4362 3 ปีที่แล้ว +1

      @@selfedu_rus если запустить ваш исходник, то аватар не отображается

    • @serg888fert4
      @serg888fert4 2 ปีที่แล้ว +2

      @@nazarkhort4362 Скорее всего в файле UserLogin.py в функции getAvatar() у Вас в конце нет оператора return img
      в css тоже не нашел класса profile-table. поэтому написал сам
      .profile-table img, .profile-table svg {
      width: 150px;
      height: 150px;
      top: 20%;
      left: 50%;
      margin: -12px 0 0 -12px;
      }

  • @ShDShD-sv6yx
    @ShDShD-sv6yx 7 หลายเดือนก่อน +1

    Автор понимаю бесплатно и тп, но посмотри англоязычные курсы там авторы все-таки более последовательно далеют подачу материала. Здесь как-то нарубил куски и вот держи.

    • @Frassorini
      @Frassorini 2 หลายเดือนก่อน

      Кто например? Подача немного трудная, согласен