8 страхотни малки фреймворка на Python

Удобството и гъвкавостта на Python означават, че той се използва за изграждане на софтуер в почти всяка сфера от ИТ живота. Една от основните ниши са уеб услугите, където скоростта на развитие на Python и гъвкавите метафори улесняват бързото стартиране и работа на уебсайтовете.

И както се досещате, Python ви дава много възможности за избор и широта в уеб рамки, както малки, така и големи. В края на краищата, не всеки уеб проект трябва да бъде корпоративен. Повечето трябва да са достатъчно големи, за да свършат работата, и не по-големи. Тази статия разглежда осем от най-известните рамки на Python, които подчертават простотата, леката доставка и тесния фокус.

Бутилка

Бутилката може да се счита за вид мини-колба, тъй като е дори по-компактна и лаконична от тази друга „микрорамка“. Поради минималния си отпечатък, бутилката е идеална за включване в други проекти или за бързо доставяне на малки проекти като REST API. (Колбата е обсъдена по-долу.) 

Цялата кодова база за бутилка се побира в един файл и няма абсолютно никакви външни зависимости. Въпреки това Bottle е оборудван с достатъчно функционалност за създаване на често срещани видове уеб приложения, без да разчита на външна помощ.

Системата за маршрутизиране в Bottle, която преобразува URL адресите във функциите, има почти точно същия синтаксис като Flask. Вие също не сте ограничени до твърдо свързан набор от пътеки; можете да ги създавате динамично. Данните за заявки и отговори, „бисквитки“, променливи на заявки, данни от формуляри от действие на POST, HTTP заглавки и качвания на файлове могат да бъдат достъпни и манипулирани чрез обекти в бутилка.

Всяка способност е внедрена с добро внимание към детайлите. Например при качването на файлове не е нужно да преименувате файла, ако конвенцията за неговото именуване се сблъска с целевата файлова система (като наклонени черти в името в Windows). Бутилката може да направи това за вас.

Бутилката включва свой собствен прост механизъм за HTML шаблониране. Отново, макар и минимален, механизмът за шаблониране има всички основни неща. Променливите, включени в шаблон, се визуализират с безопасен HTML по подразбиране; трябва да посочите кои променливи са безопасни за възпроизвеждане буквално. Ако предпочитате да замените шаблона на Bottle за друг, като Jinja2, Bottle ви позволява да го правите без суетня. Предпочитам системата с прости шаблони, доставена с бутилка; това е бързо, синтаксисът му е непретенциозен и ви позволява да смесвате код и текст на шаблон без излишни затруднения.

Бутилката дори поддържа множество сървърни задни краища. Той идва със собствен вграден минисервър за бързо тестване, но също така ще поддържа общ WSGI, голямо разнообразие от WSGI-съвместими HTTP сървъри и обикновен стар CGI, ако е необходимо.

Bottle не се нуждае от толкова документация, колкото другите рамки, но документите в никакъв случай не са оскъдни. Всички важни неща се побират на една (макар и дълга) уеб страница. Освен това ще намерите пълна документация за всеки API, примери за внедряване на различни инфраструктури, обяснение на вградения език за шаблониране и множество често срещани рецепти.

Както при Flask, можете да разширите функционалността на Bottle ръчно или чрез приставки. Приставките за бутилки не са толкова многобройни като тези на Flask, но има полезни части, като интеграция с различни слоеве на база данни и основно удостоверяване на потребителя. За асинхронна поддръжка Bottle може да използва един от съществуващите сървърни адаптери, който се изпълнява асинхронно, например aiohttp / uvloop, но async/awaitне се поддържа отначало .

Едно от последствията на минимализма на бутилката е, че някои елементи просто ги няма. Валидирането на формуляра, включително функции като защита на CSRF (фалшифициране на заявки между сайтове), не е включено. Ако искате да създадете уеб приложение, което поддържа висока степен на взаимодействие с потребителя, ще трябва сами да добавите тази поддръжка.

Друг проблем с Bottle е, че развитието е спряло; последното издание на точка, 0.12, пристигна през 2013 г. Въпреки това, бутилката продължава да се поддържа и нейните разработки остават използваеми за производство. Разработчиците възнамеряват да доставят нови версии, които отделят поддръжка за стари версии на Python.

CherryPy

CherryPy съществува под една или друга форма от почти 20 години, но не е загубил минимализма и елегантността, които я отличават от самото начало.

Целта, която стои зад CherryPy, освен да съдържа само голите битове, необходими за обслужване на уеб страници, е да се чувствате, доколкото е възможно, не като „уеб рамка“, а като всеки друг вид приложение на Python. Сайтове като Hulu и Netflix са използвали CherryPy в производството, тъй като рамката осигурява изключително ненатрапчива основа, върху която да се надгражда. CherryPy използва обединени нишки под капака, толкова по-добре да поддържа многонишкови сървърни адаптери.

CherryPy ви позволява да държите уеб приложението си отделно от основната логика. За да присвоите функциите на приложението си към URL адреси или маршрути, обслужвани от CherryPy, създавате клас, където пространствата от имена на обектите се пренасочват директно към URL адресите, които искате да обслужвате. Например коренът на уебсайта се предоставя от функция, наречена „индекс“. Параметрите, предадени на тези функции, се използват за обработка на променливи, предоставени от методите GET или POST.

Битовете, които CherryPy включва, трябва да работят като градивни елементи на ниско ниво. Включени са идентификатори на сесии и обработка на бисквитки, но HTML шаблони не са. Подобно на Bottle, CherryPy предлага начин за картографиране на маршрути към директории на диска за обслужване на статични файлове.

CherryPy често се отлага към съществуваща библиотека на трети страни, за да поддържа функция, вместо да я предоставя родно. Приложенията WebSocket например не се поддържат от CherryPy директно, а чрез библиотеката ws4py.

Документацията за CherryPy включва удобен урок за разглеждане на различните аспекти на програмата. Няма да ви преведе през цялостно приложение от край до край, за разлика от някои други уроци по рамки, но все пак е полезно. Документите идват с полезни бележки за разполагане във виртуални хостове, обратно проксиране чрез Apache и Nginx и много други сценарии.

Сокол

Ако изграждате базирани на REST API и нищо друго, Falcon е създаден точно за вас. Лек и бърз, с почти никакви зависимости извън стандартната библиотека, Falcon предоставя всичко необходимо за REST API и нищо повече. Falcon 2.0, пуснат през 2019 г., премахва поддръжката на Python 2.x и изисква поне Python 3.5.

Голяма част от причините, поради които Falcon печели етикета „лек и тънък“, няма много общо с броя на редовете код в рамката. Това е така, защото Falcon почти не налага собствена структура на приложенията. Всичко, което приложение Falcon трябва да направи, е да посочи кои функции се свързват към кои крайни точки на API. Връщането на JSON от крайна точка включва малко повече от настройка на маршрут и връщане на данните чрез json.dumpsфункцията от стандартната библиотека на Python. Поддръжката за async все още не е попаднала във Falcon, но се работи по това да се случи във Falcon 3.0.

Falcon също така използва разумни стандартни настройки по подразбиране, така че е необходимо малко бъркотия за настройка. Например 404s се издигат по подразбиране за всеки маршрут, който не е изрично деклариран. Ако искате да върнете грешки на клиента, можете да съберете едно от редица изключения за запаси, свързани с рамката (като например HTTPBadRequest) или да използвате общо falcon.HTTPErrorизключение. Ако се нуждаете от предварителна или последваща обработка на маршрут, Falcon предоставя куки и за тях.

Фокусът на Falcon върху API-та означава, че тук има малко за изграждане на уеб приложения с конвенционални потребителски интерфейси на HTML. Не очаквайте много по отношение на функциите за обработка на формуляри и инструментите за защита на CSRF, например. Въпреки това, Falcon предлага елегантни опции за разширяване на функционалността си, така че да могат да бъдат изградени по-сложни елементи. Освен гореспоменатия механизъм за свързване, ще намерите интерфейс за създаване на междинен софтуер, който може да се използва за обвиване на всички API на Falcon.

Документацията за Falcon е тънка в сравнение с други рамки, но само защото има по-малко за покриване. Ръководството за потребителя включва официална стъпка по стъпка за разглеждане на всички основни функции, заедно с раздел за бързо стартиране, който ви позволява да видите примерен код със или без анотация.

FastAPI

Името на FastAPI е добро обобщение на това, което прави. Той е създаден за бързо създаване на крайни точки на API и също се изпълнява бързо.

FastAPI използва проекта Starlette за високоскоростното си мрежово ядро, но не е нужно да знаете за вътрешността на Starlette, за да използвате FastAPI. Определяте крайни точки по същия начин като приложението Flask или Bottle - използвайте декоратори, за да посочите кои функции обработват кои маршрути - и след това връщате речници, които се превеждат автоматично в JSON.

Можете лесно да отмените начина, по който нещата се връщат. Например, ако искате да върнете HTML / XML от някои крайни точки, можете да направите това, като просто върнете персонализиран Responseобект. Ако искате да добавите персонализиран междинен софтуер, можете да включите всичко, което следва стандарта ASGI. 

FastAPI използва подсказването на типа на Python, за да осигури ограничения върху видовете данни, които маршрутите приемат. Например, ако имате маршрут с типа Optional[int], FastAPI ще отхвърли всякакви изпращания с изключение на цели числа. Не е нужно да добавяте код за проверка на данни към крайните си точки; можете просто да използвате подсказки за тип и да оставите FastAPI да свърши работата.

Естествено, някои неща са пропуснати. Например няма вграден механизъм за HTML шаблони, но няма недостиг на решения на трети страни, които да запълнят тази празнина. Същото е и с връзката с база данни, но документацията съдържа подробности за това как да накарам някои ORM (например Peewee) да работят с асинхронното поведение на FastAPI.

Колба

Много дискусии за Python мрежовите рамки започват с Flask и с добра причина. Колбата е добре установена, добре разбрана рамка, която е лесна за използване и доста стабилна. Невъзможно е да се объркате, като използвате Flask за лек уеб проект или основен REST API, но ще се изправите пред тежък вдигане, ако се опитате да изградите нещо по-голямо.

Централната привлекателност на Flask е ниската бариера за влизане. Основно приложение „здравей, свят“ може да бъде настроено в по-малко от 10 реда на Python. Flask включва широко използвана система за шаблониране на HTML, Jinja2, за да улесни изобразяването на текст, но Jinja2 може да бъде заменена за произволен брой други механизми за шаблони (като Mustache) или можете да пуснете своя.

В името на простотата, Flask пропуска изящни неща като слой данни или ORM и не предлага разпоредби за валидиране на формуляри. Flask обаче може да бъде разширена чрез разширения, от които има десетки, обхващащи много често срещани случаи като кеширане, обработка и проверка на формуляри и свързаност с база данни. Този опростен по подразбиране дизайн ви позволява да започнете да проектирате Flask приложение с абсолютния минимум функционалност, след което да сложите само парчетата, от които се нуждаете, когато имате нужда от тях.

Документацията на Flask е гениална и лесна за четене. Документът за бърз старт върши отлична работа, за да започнете, като същевременно обяснява значението на избора по подразбиране за обикновено приложение на Flask, а документите на API са пълни с добри примери. Също така отлична е колекцията от Flash фрагменти, които са бързи и мръсни примери за това как да се изпълнят конкретни задачи, като например как да се върне обект, ако той съществува, или грешка 404, ако не съществува.

Flask достигна своя етап 1.0 през 2018 г., като Python 2.6 и Python 3.3 бяха минимално поддържаните версии и с много от поведенията си най-накрая бяха заложени. Flask не поддържа изрично асинхронния синтаксис на Python, но за задоволяване на това търсене е отделена съвместима с API вариация на Flask, наречена Quart.

Пирамида

Малък и лек, Pyramid е много подходящ за задачи като излагане на съществуващ код на Python като REST API или предоставяне на ядрото за уеб проект, в който разработчикът прави по-голямата част от тежката работа.

„Пирамидата ще ви позволи да станете бързо продуктивни и ще расте заедно с вас“, се казва в документацията. „Няма да ви задържа, когато приложението ви е малко и няма да ви попречи, когато приложението ви стане голямо.“

Един добър начин да се опише минимализмът на Pyramid би бил „без политика“, термин, използван в раздела на документацията, който обсъжда как Pyramid се оформя спрямо други уеб рамки. По принцип, „без политика“ означава, че коя база данни или кой език за шаблони сте избрали да използвате, не е от значение за Pyramid.

Необходима е много малко работа за изграждане на основно приложение на Pyramid. Както при Bottle and Flask, приложението на Pyramid може да се състои от един файл на Python, освен файловете за самата рамка. Един прост еднопосочен API изисква не повече от дузина или повече реда код. По-голямата част от тях са примерни from … importизявления и настройка на WSGI сървъра.

По подразбиране Pyramid включва няколко елемента, които са често срещани в уеб приложенията, но те се предоставят като компоненти, които да бъдат свързани, а не като пълноценни решения. Поддръжката за потребителски сесии, например, дори се предлага с CSRF защита. Но поддръжката на потребителски акаунти, като влизания или управление на акаунти, не е част от сделката. Ще трябва да го превъртите сами или да го добавите чрез приставка. Същото важи и за обработката на формуляри и връзките с база данни.

Pyramid дори предоставя начин за създаване на шаблони от предишни проекти на Pyramid за повторно използване на предишната работа. Тези шаблони, наречени „скелета“, генерират приложение на Pyramid с просто маршрутизиране и някои начални HTML / CSS шаблони. Включените скелета включват примерен стартов проект и проект, който се свързва с бази данни чрез популярната библиотека на Python SQLAlchemy.