LINUX.ORG.RU

объясните про библиотеки для фреймворка Flask

 , ,


1

2

Здравтвуй {{ user.name }}, тут решил потыкать палочкой в микрофреймворк фласк, так как он достаточно хорошо может работать вместе с сервером Gevent и так же из каробки можно замутить производительный РестФулл api. И тут такой вопрос появился Это получается Фласк не могет на прямую и без сторонних костылей работать с популярными питоновскими библиотеками и нужно обязательно искать какой-то порт библиотеки именно для фласка?

Накачал 100500 книг с интернета и не в одной не рассказывается , как в фласке работать с изображениями на той же самой популярной библиотеки Pillow



Последнее исправление: NetSurf (всего исправлений: 1)

Э-э, импортишь библиотеку как любой питоновский модуль и работаешь с ней. Только имей в виду, что писать долго выполняющийся код в методе контроллера - это плохо, лучше в отдельном потоке запустить задачу, а из контроллера сразу отдать ответ, например 202 Accepted.

hippi90 ★★★★★
()
Ответ на: комментарий от hippi90

А зачем тогда появилась таже библиотека flask-pymongo, есть же pymongo от создателей? Или там какие-то функции из родной библиотеки не правильно работают с фласком и для этого нужно было делать дополнительную библиотеку? Я посмотрел популярную либу flask-sqlalchemy , она состоит всего из нескольких строк кода

NetSurf
() автор топика
Ответ на: комментарий от deadNightTiger

Штука хорошая наподобие aiohttp, только в последнем есть еще http client для создания запросов на другие сайтытолько. Только пока не понятно как в этих штуках работать с сихронными библиотеками типо Pillow, в отдельном потоке обрабатывать изображения что ли

NetSurf
() автор топика
Ответ на: комментарий от pawnhearts

Спасибо, а как думаешь сильно ли отличаются производительность http клиентов urllib ,который пропатченный в Gevent и может в ассихронность и клиент из aiohttp?

Тут проводил небольшой бенч получение несколько тысяч раз одну страницу , у Gevent вышло за 10 секунд а у aiohttp что-то не ахти результат . Но в гевент устанавливал Pool(200) а в aiohttp пока еще не вкурил, как сделать пулл, может от этого и результат был не шибко плохой.

NetSurf
() автор топика
Ответ на: комментарий от hippi90

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

Чему ты учишь новичков. Гораздо проще взять гуй фласка и отметить там нужные модули, все само поставится и будет счастье

Siado ★★★★★
()
Ответ на: комментарий от Siado

Какой еще гуй и как в нем отмечать нужные модули? В чем плох метод поставить нужные модули через pip и делать импорт их в своем проекте?

NetSurf
() автор топика
Ответ на: комментарий от pawnhearts

На aiohttp что-то наподобие этого

from gevent import monkey
monkey.patch_all()

import urllib.request
from gevent.pool import Pool
urls = [
   #много урлов
]
def download(url):
    return urllib.request.urlopen(url).read()

if __name__ == "__main__":
pool = Pool(200)
print(pool.map(download, urls)) 

NetSurf
() автор топика
Ответ на: комментарий от NetSurf

как-то так, например. или можешь просто create_task делать для тажного url.

ещё есть asyncio.wait

import aiohttp

import asyncio

async def get_site(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            print(resp.status)
            res = await resp.text()

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
    *[get_site('http://ya.ru') for i in range(100)]
))
loop.close()
pawnhearts ★★★★★
()
Ответ на: комментарий от NetSurf

Ну посмотри в код же! Он открыт!

Настройки коннекта к бд допустим берутся из flask app.config,

Или там какие-то функции из родной библиотеки не правильно работают с фласком

Как ты пришел к этому ?

ggrn ★★★★★
()
Ответ на: комментарий от pawnhearts

Затестил Это и пример, у меня что-то наподобие этого было. Этот пример сливает реализации на Gevent примерно в 2 раза

NetSurf
() автор топика
Ответ на: комментарий от pawnhearts

Так то да, просто если посмотреть основное время тратиться на сеть и в чем шибко преимущество у гевента, может как-то хитрожопо собирается в пулы. А так шибко большого профита не будет, если с помощью балансеровщика распределить aiohttp по ядрам?

NetSurf
() автор топика

Не, ты не так понял. Под фласком работает всё так же как и без фласка. За исключением того, что фласк использует (в dev режиме) внутри http сервер, который работает по аналогии бесконечного цикла, и блокируется при выполнении долгих запросов. Поэтому на продакшен веб приложение запускают другими веб серверами по типу gunicorn, который отгораживают от внешнего мира ещё дополнительным реверс прокси - nginx, lighttpd, https://caddyserver.com/

Пакеты для фласка создают просто как обёртки, упрощающие интеграцию библиотек в request based архитектуру на основе flask. Сложную работу по типу конвертации видео, компрессии файлов - выносят в отдельные сервисы через посредников - очереди, брокеров сообщений (ZeroMQ), и интегрируют с ними другие бэкенды, которые делают кропотливую работу.

Gevent же - это немного другой «цикл», который может использоваться как ядро веб сервера, и он имеет асинхронную архитектуру, которая усложняет работу с БД и прочим, т.к. требует, чтобы весь код драйверов БД и т.п. был также асинхронным (в идеале).

Короче, не лезь в Gevent + Flask, а покрути лучше pypy + Flask, а заниматься преждевременной оптимизацией и выбирать асинхронную архитектуру для Flask - это большой риск.

menangen ★★★★★
()
Последнее исправление: menangen (всего исправлений: 1)
Ответ на: комментарий от NetSurf

flask-sqlalchemy, она состоит всего из нескольких строк кода

Ты плохо смотрел. Я когда-то тоже так смотрел, но недавно посмотрел ещё раз и понял что там не всё так тривиально.

У flask есть свои заморочки с возможностью иметь несколько приложений Flask внутри одного процесса, в проекте который это использует как правило образуется каша из циклических зависимостей между модулями. И для того чтобы нормально раскидывать сессии между отдельными приложениями и частично избавиться от этой каши во flask-sqlalchemy реализован реестр сессий, например.

На самом деле, тебе врядли нужна эта фигня с несколькими приложениями внутри одного процесса, ты можешь просто объявить где-нибудь глобальный scoped_session и не использовать flask-sqlalchemy. Это ок в большнстве случаев.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

производительный

python

Вот так надо было сравнивать если хочешь срачика.

Оп, «можно замутить производительный РестФулл api» - я бы посоветовал не писать апи на flask или там джанге - тут основной профит будет когда ты всякие там шаблоны будешь использовать что генерировать странички, админки там, вот это все что по сути фронт. Апиху ты можешь, конечно, написать, но в целом тебе будет проще это сделать без всей той дополнительной мешанины, которая есть в таких фреймворках.

micronekodesu ★★★
()
Ответ на: комментарий от micronekodesu

Пфф, да норм у питона с производительностью. По моему опыту, если нормально писать, без всяких flask'ов и django, то всё упирается в сеть и БД.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

То что я видел (да и писал, чего уж там) чаще упирается в кривые архитектурные решения и прочие неоптимальные алгоритмы ^_^

micronekodesu ★★★
()
Ответ на: комментарий от ei-grad

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

NetSurf
() автор топика
Ответ на: комментарий от ei-grad

А что думаешь про няшный джанго рестфремворк, на котором по джанговской традиции, можно в 50 строчек кода сделать сервис. Или эта штука слишком не производительная и без какого-нибудь брокера задач типо celary не обойтись будет?

NetSurf
() автор топика
Ответ на: комментарий от micronekodesu

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

https://blog.disqus.com/scaling-django-to-8-billion-page-views http://eng.uber.com/mezzanine-migration/

NetSurf
() автор топика
Ответ на: комментарий от menangen

Бро, спасибо за объяснение, что думаешь про джанго рестфреймворк, пробовал в серьезных проектах?

NetSurf
() автор топика
Ответ на: комментарий от NetSurf

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

micronekodesu ★★★
()
Ответ на: комментарий от NetSurf

Дочитал до:

Потом понял, что штука абсолютно бесполезная: нам всегда требовалось что-то из HTTP HEADERS, COOKIES и GET/POST parameres в обработчике запроста.

Чтобы проверить — авторизирован ли пользователь, например.

Дальше читать не стал. Я думал, я говнокодер...

авторизован ли пользователь, правильный способ:
https://pythonhosted.org/Flask-Security/quickstart.html

Shadow ★★★★★
()
Ответ на: комментарий от hippi90

долго выполняющийся код в методе контроллера - это плохо

почему?

redixin ★★★★
()
Ответ на: комментарий от Shadow

Ну он все-таки кор разработчик питона и создатель нынче популярной библиотеки aiohttp , я думаю Гвидо не будет брать в команду абы кого

NetSurf
() автор топика
Ответ на: комментарий от NetSurf

Не, рест на джанге не писал. Тока цельные приложухи. Зато писал на falcon и peewee - очень понравилось, работает и с gunicorn и с pypy и с 3-им питоном.

https://github.com/falconry/falcon

menangen ★★★★★
()
Ответ на: комментарий от NetSurf

Мне больше django-tastypie нравится, но на django-rest-framework тоже можно нормально api'шки клепать. Про производительность это всё относительно, в большинстве приложений пофиг на то что можно на порядок снизить оверхед от фреймворка. С оверхедом фреймворка ты получишь порядка 1K RPS с ядра, а если взять какой-нибудь bottle или falcon - порядок будет уже 10K с ядра на простых обработчиках.

ei-grad ★★★★★
()
Ответ на: комментарий от Shadow

Андрей часто опускается до разжевывания таких вещей для уровня junior, отсюда такое неоднозначное впечатление. Тоже этим обманулся когда-то.

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

Возможно.
Мне показалось, что раз Flask сразу всё предлагает через «магию» декораторов и глобальные переменные делать, то ачем напрямую с куками для авторизации возиться?

Я вообще грубо все post запросы считаю типа json, и вообще не парюсь с телом запроса - есть объект json, а параметры get - через путь... Всё дубово, просто, надёжно и RESTful

Shadow ★★★★★
()
Ответ на: комментарий от NetSurf

У меня было 2 раза когда он меня носом в документацию тыкал. Но правда 1 раз я его тыкал. А документация постоянно обновляется и читать ее все напряжно каждый раз. А так нормальный человек (правда слом совместимости иногда злит)

demrnd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.