8 fantastiska små Python-webbramar

Pythons bekvämlighet och mångsidighet innebär att den används för att bygga programvara i nästan alla delar av IT-livet. En viktig nisch är webbtjänster, där Pythons utvecklingshastighet och flexibla metaforer gör det enkelt att starta webbplatser snabbt.

Och precis som du kanske gissar ger Python dig många val och latitud i webbramar, både små och stora. När allt kommer omkring behöver inte alla webbprojekt vara företagsskaliga. De flesta borde vara tillräckligt stora för att få jobbet gjort och inte större. Denna artikel undersöker åtta av de mest kända Python-ramarna som betonar enkelhet, lätt leverans och ett tätt fokus.

Flaska

Flaskan kan betraktas som en slags mini-kolv, eftersom den är ännu mer kompakt och kortfattad än den andra ”mikroramen”. På grund av sitt minimala fotavtryck är Bottle perfekt för att inkludera i andra projekt eller för att snabbt leverera små projekt som REST API: er. (Kolven diskuteras nedan.) 

Hela kodbasen för Bottle passar i en enda fil och har absolut inga externa beroenden. Trots det är Bottle utrustad med tillräcklig funktionalitet för att bygga vanliga typer av webbappar utan att förlita sig på extern hjälp.

Ruttsystemet i Bottle, som mappar webbadresser till funktioner, har nästan exakt samma syntax som Flask. Du är inte heller begränsad till en trådbunden uppsättning stigar; du kan skapa dem dynamiskt. Förfrågan och svarsdata, cookies, frågevariabler, formulärdata från en POST-åtgärd, HTTP-rubriker och filuppladdningar kan alla nås och manipuleras med hjälp av objekt i flaskan.

Varje funktion har implementerats med stor uppmärksamhet på detaljer. Med filöverföringar behöver du till exempel inte byta namn på filen om dess namnkonvention kolliderar med målfilsystemet (t.ex. snedstreck i namnet på Windows). Flaskan kan göra det åt dig.

Bottle innehåller sin egen enkla HTML-mallmotor. Återigen, även om det är minimalt, har mallmotorn alla viktiga saker. Variabler som ingår i en mall återges som standard med säker HTML; du måste ange vilka variabler som är säkra att reproducera bokstavligen. Om du hellre vill byta ut Bottles mallmotor mot en annan, som Jinja2, låter Bottle dig göra det utan krångel. Jag föredrar det enkla mallsystemet som levereras med flaskan; den är snabb, dess syntax är opretentiös och låter dig blanda ihop kod och malltext utan onödiga svårigheter.

Flaskan stöder till och med flera serverbackar. Den levereras med en egen inbyggd miniserver för snabb testning, men kommer också att stödja generisk WSGI, ett brett utbud av WSGI-kompatibla HTTP-servrar och vanligt gammal CGI om det behövs.

Flaskan behöver inte så mycket dokumentation som andra ramar, men dokumenten är inte snäva. Alla viktiga saker passar på en enda (om än lång) webbsida. Utöver det hittar du fullständig dokumentation för varje API, exempel för distribution på olika infrastrukturer, en förklaring av det inbyggda mallningsspråket och en massa vanliga recept.

Som med Flask kan du utöka flaskans funktioner manuellt eller via plug-ins. Flaskans plugin-program är inte så många som Flask's, men det finns användbara bitar, till exempel integration med olika databaskikt och grundläggande användarautentisering. För async-stöd kan Bottle använda en av de befintliga serveradaptrarna som körs asynkront, till exempel aiohttp / uvloop, men async/awaitstöds inte naturligt.

En konsekvens av Bottles minimalism är att vissa saker helt enkelt inte finns där. Formvalidering, inklusive funktioner som CSRF (cross-site request forgery) skydd, ingår inte. Om du vill bygga en webbapplikation som stöder en hög grad av användarinteraktion måste du lägga till det själv.

En annan fråga med Bottle är att utvecklingen har stoppat; den sista punktutgåvan, 0,12, anlände 2013. Med detta sagt fortsätter Bottle att bibehållas, och dess utvecklingsreleaser är fortfarande användbara för produktion. Utvecklarna tänker leverera nya versioner som ger stöd för äldre utgåvor av Python.

CherryPy

CherryPy har funnits i en eller annan form i nästan 20 år, men har inte tappat den minimalism och elegans som skiljer den från början.

Målet bakom CherryPy, förutom att endast innehålla de bara bitarna som behövs för att betjäna webbsidor, är att så långt som möjligt känna sig inte som ett ”webbramverk” utan som alla andra typer av Python-applikationer. Webbplatser som Hulu och Netflix har använt CherryPy i produktion eftersom ramverket ger en mycket diskret bas att bygga på. CherryPy använder poolade trådar under huven, desto bättre är det att stödja multitrådade serveradaptrar.

Med CherryPy kan du hålla din webbapplikation åtskild från kärnlogiken. För att mappa applikationsfunktionerna till webbadresser eller rutter som serveras av CherryPy skapar du en klass där objekternas namnutrymmen direkt till de webbadresser du vill betjäna. Till exempel tillhandahålls webbplatsens rot av en funktion som heter "index". Parametrar som skickas till dessa funktioner används för att hantera variabler som tillhandahålls av GET- eller POST-metoder.

De bitar som CherryPy innehåller är tänkt att fungera som byggstenar på låg nivå. Sessionsidentifierare och hantering av kakor ingår, men HTML-mallar är inte. Liksom Bottle erbjuder CherryPy ett sätt att kartlägga rutter till kataloger på disken för statisk filvisning.

CherryPy kommer ofta att hänvisa till ett befintligt tredjepartsbibliotek för att stödja en funktion snarare än att tillhandahålla den naturligt. WebSocket-applikationer stöds till exempel inte av CherryPy direkt utan via ws4py-biblioteket.

Dokumentationen för CherryPy innehåller en praktisk genomgång av de olika aspekterna av programmet. Det tar dig inte igenom en fullständig helhetsapplikation, till skillnad från vissa andra ramhandledning, men det är ändå användbart. Dokumenten kommer med praktiska anteckningar om distribution i virtuella värdar, omvänd proxying via Apache och Nginx och många andra scenarier.

Falk

Om du bygger REST-baserade API: er och inget annat, gjordes Falcon bara för dig. Lunt och snabbt, med nästan inga beroenden utöver standardbiblioteket, erbjuder Falcon allt du behöver för REST API: er och inget mer. Falcon 2.0, släppt 2019, gör bort Python 2.x-stöd och kräver åtminstone Python 3.5.

En stor del av varför Falcon tjänar etiketten "lätt och smal" har lite att göra med antalet kodrader i ramverket. Det beror på att Falcon påtvingar applikationer nästan ingen egen struktur. Allt som en Falcon-applikation behöver göra är att ange vilka funktioner som mappar till vilka API-slutpunkter. Att returnera JSON från en slutpunkt innebär lite mer än att ställa in en rutt och returnera data via json.dumpsfunktionen från Pythons standardbibliotek. Stöd för async har ännu inte landat i Falcon, men det pågår arbete för att få det att hända i Falcon 3.0.

Falcon använder också sane out-of-the-box standardvärden, så lite tinkering behövs för installationen. Till exempel höjs 404s som standard för alla rutter som inte uttryckligen deklareras. Om du vill returnera fel till klienten kan du höja ett av ett antal lagerundantag som ingår i ramverket (t.ex. HTTPBadRequest) eller använda ett generiskt falcon.HTTPErrorundantag. Om du behöver förbehandling eller efterbehandling för en rutt, erbjuder Falcon även krokar för dem.

Falcons fokus på API: er innebär att det finns lite här för att bygga webbappar med konventionella HTML-användargränssnitt. Förvänta dig inte mycket i form av exempelvis bearbetningsfunktioner och CSRF-skyddsverktyg. Med detta sagt erbjuder Falcon eleganta alternativ för att utöka dess funktionalitet, så mer sofistikerade föremål kan byggas. Bortsett från den ovan nämnda anslutningsmekanismen hittar du ett gränssnitt för att skapa mellanprogram som kan användas för att linda alla Falcons API: er.

Dokumentationen för Falcon är smal jämfört med andra ramar, men bara för att det finns mindre att täcka. Användarhandboken innehåller en formell steg-för-steg-genomgång av alla viktiga funktioner, tillsammans med en snabbstartssektion som låter dig visa exempelkod med eller utan kommentar.

FastAPI

FastAPIs namn är en bra summering av vad det gör. Det är byggt för att snabbt skapa API-slutpunkter, och det går också snabbt.

FastAPI använder Starlette-projektet för sin höghastighetsnätverkskärna, men du behöver inte veta om Starlette-interna för att använda FastAPI. Du definierar slutpunkter på ungefär samma sätt som en kolv- eller flaskapp - använd dekoratörer för att ange vilka funktioner som hanterar vilka rutter - och returnerar sedan ordböcker som översätts automatiskt till JSON.

Du kan enkelt åsidosätta hur saker returneras. Om du till exempel vill returnera HTML / XML från vissa slutpunkter kan du göra det genom att helt enkelt returnera ett anpassat Responseobjekt. Om du vill lägga till anpassad mellanprogramvara kan du lägga till allt som följer ASGI-standarden. 

FastAPI använder Pythons typtips för att ge begränsningar för de typer av data som rutter accepterar. Till exempel, om du har en rutt med typen Optional[int]kommer FastAPI att avvisa alla inlämningar utom heltal. Du behöver inte lägga till datavalideringskod i dina slutpunkter. du kan bara använda typtips och låta FastAPI göra jobbet.

Naturligtvis är vissa saker utelämnade. Det finns till exempel ingen inbyggd HTML-mallmotor, men det finns ingen brist på tredjepartslösningar för att fylla det gapet. Samma sak med databasanslutning, men dokumentationen innehåller information om hur man lockar vissa ORM (t.ex. Peewee) för att arbeta med FastAPIs asynkbeteende.

Flaska

Många diskussioner om Pythons webbramar börjar med Flask och med goda skäl. Flaska är ett väletablerat, välförstått ramverk som är lätt att använda och ganska stabilt. Det är nästan omöjligt att gå fel med att använda Flask för ett lätt webbprojekt eller ett grundläggande REST API, men du kommer att möta tunga lyft om du försöker bygga något större.

Flask centrala överklagande är dess låga inträdesbarriär. En grundläggande "Hello World" -app kan ställas in på färre än 10 rader Python. Flaskan innehåller ett allmänt använt HTML-mallsystem, Jinja2, för att göra rendering av text enkelt, men Jinja2 kan bytas ut mot valfritt antal andra mallmotorer (som mustasch) eller så kan du rulla din egen.

I enkelhetens namn utelämnar Flask smaker som ett datalager eller ORM och erbjuder inga bestämmelser för formvalidering. Flaskan kan emellertid utökas genom tillägg, av vilka det finns dussintals, som täcker många vanliga användningsfall som cachning, formulärhantering och validering och databasanslutning. Den här lean-by-default-designen gör att du kan börja konstruera en Flask-applikation med det absoluta minimumet av funktionalitet, och sedan bara lagra i bitarna du behöver när du behöver dem.

Flask dokumentation är genial och lätt att läsa. Snabbstartsdokumentet gör ett utmärkt jobb med att komma igång samtidigt som det förklarar betydelsen av standardvalen för en enkel Flask-applikation, och API-dokumenten är fyllda med bra exempel. Också utmärkt är samlingen av Flash-utdrag, som är snabba och smutsiga exempel på hur man utför specifika uppgifter, till exempel hur man returnerar ett objekt om det finns eller ett 404-fel om det inte gör det.

Flask nådde sin milstolpe 1.0-utgåva 2018, med Python 2.6 och Python 3.3 som de minsta stödda versionerna, och med många av dess beteenden slutligen i sten. Flask stöder inte uttryckligen Pythons async-syntax, men en API-kompatibel variant av Flask som heter Quart har avskalats för att tillgodose detta krav.

Pyramid

Liten och lätt, Pyramid är väl lämpad för uppgifter som att exponera befintlig Python-kod som ett REST API, eller tillhandahålla kärnan för ett webbprojekt där utvecklaren gör det mesta av tunga lyft.

"Pyramid gör att du snabbt kan bli produktiv och växa med dig", säger dokumentationen. "Det kommer inte att hålla dig tillbaka när din ansökan är liten, och den kommer inte i vägen för dig när din ansökan blir stor."

Ett bra sätt att beskriva Pyramidens minimalism skulle vara "fri från policy", en term som används i avsnittet i dokumentationen som diskuterar hur Pyramid formar sig mot andra webbramar. I grund och botten betyder "fri från policy" att vilken databas eller vilket mallspråk du väljer att använda är inte Pyramidens intresse.

Mycket lite arbete behövs för att bygga en grundläggande Pyramid-applikation. Som med flaska och kolv kan en Pyramid-applikation bestå av en enda Python-fil, förutom filerna för själva ramverket. Ett enkelt API med en rutt kräver inte mer än ett dussin eller så kodrader. Det mesta är pannplattaliknande from … importuttalanden och installation av WSGI-servern.

Som standard innehåller Pyramid flera objekt som är vanliga i webbappar, men de tillhandahålls som komponenter som ska sys ihop, inte som heltäckande lösningar. Stöd för användarsessioner, till exempel, kommer till och med med CSRF-skydd. Men stöd för användarkonton, till exempel inloggningar eller kontohantering, ingår inte i affären. Du måste rulla den själv eller lägga till den via ett plugin-program. Detsamma gäller för formulärhantering och databasanslutningar.

Pyramid ger till och med ett sätt att skapa mallar från tidigare Pyramid-projekt för att återanvända tidigare arbete. Dessa mallar, som kallas "byggnadsställningar", genererar en Pyramid-app med enkel routing och några start-HTML / CSS-mallar. Medföljande byggnadsställningar inkluderar ett exempel på startprojekt och ett projekt som ansluter till databaser via det populära Python-biblioteket SQLAlchemy.