Starlette 1.0.0: klíčové změny ve stabilním vydání
Starlette dosáhlo první stabilní verze 1.0.0 po téměř osmi letech vývoje. Vydání se zaměřuje na odstranění zastaralých API, opravu chyb v zpracování WebSocket, formulářů a statických souborů. Framework zůstává základem FastAPI a používá se v Python MCP SDK pro AI aplikace.
Nové funkce
V verzi 1.0.0 bylo přidáno sledování přístupu a změn relace v SessionMiddleware. To umožňuje middleware zachytit čtení a úpravu relančních dat bez dalších úprav.
V relesi 1.0.0rc1 byl zaveden generický stav pro WebSocket. Nyní je stav připojení typizován, což usnadňuje práci s TypedDict nebo Pydantic modely v asynchronních obsluhách.
Opravy chyb
Relese odstraňuje několik kritických problémů:
- Zpracování selhání WebSocket ve StreamingResponse a FileResponse: nyní odpovědi správně uzavírají připojení bez úniků.
- FormParser používá bytearray pro akumulaci polí, což snižuje spotřebu paměti při parsování velkých formulářů.
- MultiPartParser.parse() přesouvá parser.finalize() do try/except, což zabraňuje výjimkám při neúplných multipart datech.
Další opravy z rc1:
- Hlavička Content-Range pro odpovědi 416 zahrnuje jednotku bytes.
- StaticFiles zpracovává nulové bajty v cestách bez pádu.
- Parsování Range používá seřazené sloučení pro přesnost.
- Více rozsahů v odpovědi používá Content-Type místo Content-Range.
- Multipart byterange hranice aplikují CRLF ukončení.
- FileResponse nemodifikuje hlavičky při range požadavcích.
- CORS odpovědi vracejí explicitní origin při credentials.
- Jinja2Templates zahrnuje autoescape jako výchozí.
Odstraněné zastaralé prvky
Starlette 1.0.0 provádí úklid API a odstraňuje deprecated funkce. Migrace je povinná pro projekty na starších verzích.
Zde je úplný seznam odstranění:
- Parametry on_startup a on_shutdown ze Starlette a Router. Nahrazeny lifespan.
- Dekorátor on_event(). Používejte lifespan.
- Metodu add_event_handler(). Používejte lifespan.
- Metody startup() a shutdown() z Router.
- Dekorátor @app.route(). Používejte Route v routes.
- Dekorátor @app.websocket_route(). Používejte WebSocketRoute v routes.
- Dekorátor @app.exception_handler(). Používejte exception_handlers.
- Dekorátor @app.middleware(). Používejte middleware.
- Funkci iscoroutinefunction_or_partial() ze starlette.routing.
- Parametr **env_options z Jinja2Templates. Předávejte připravený jinja2.Environment přes env.
- Zastaralou signaturu TemplateResponse(name, context). Vyžaduje request: TemplateResponse(request, name, ...).
- Zastaralý parametr method z FileResponse.
Změny v chování
Jinja2Templates nyní vyžaduje nainstalovaný jinja2 již při importu, nejen při instancování. To urychluje diagnostiku závislostí v CI/CD.
Migrace na 1.0.0
- Nahraďte všechny on_startup/on_shutdown lifespan kontextem:
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: Starlette):
# startup
yield
# shutdown
app = Starlette(lifespan=lifespan, routes=[...])
- Přesuňte routy do seznamu routes:
routes = [
Route("/", endpoint=home),
WebSocketRoute("/ws", endpoint=ws_endpoint),
]
- Aktualizujte exception_handlers a middleware podobně.
- Pro Jinja2Templates připravte env předem:
import jinja2
env = jinja2.Environment(autoescape=True)
templates = Jinja2Templates(env=env)
Po aktualizaci otestujte testy na range požadavky a multipart formuláře.
Co je důležité
- Stabilita API: Odstraněny všechny deprecated prvky, kód je čistší a předvídatelnější.
- WebSocket a streamování: Opravena manipulace se selháními, vhodné pro produkci.
- Formuláře a soubory: Optimalizována paměť a parsování multipart/range.
- Lifespan náhrada: Jednotný způsob lifecycle hooků, kompatibilní s ASGI 3.0+.
- Jinja2: Přísné požadavky na závislosti a autoescape jako výchozí.
— Editorial Team
Zatím žádné komentáře.