pythonweb之Starlette

2024-06-08 22:28
文章标签 pythonweb starlette

本文主要是介绍pythonweb之Starlette,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方文档

产生背景

ASGI 标准的出现

Starlette 是在 ASGI (Asynchronous Server Gateway Interface) 标准出现后开发的。ASGI 是 Python 的新一代 web 服务器接口标准,旨在取代老旧的 WSGI 标准,支持异步处理。

Python 异步编程的兴起

近年来,Python 的异步编程能力大幅提升,加入了 async/await 语法糖以及众多支持异步编程的库和框架。这为开发高并发和高性能的 web 应用程序提供了良好的基础。

对现有 web 框架的反思

现有的 Python web 框架,如 Django 和 Flask,虽然功能强大但在某些方面也存在一些不足,比如对异步编程的支持较弱,或者过于臃肿和复杂。这激发了开发者寻求一个更轻量、更灵活的框架的需求。

API 开发的需求

随着 RESTful API 和微服务架构的流行,开发者对于构建 API 服务有了更多需求。传统的 web 框架在这方面可能不够灵活和高效。

模块化设计的趋势

近年来,软件设计的趋势向更加模块化和可组合的方向发展。开发者希望能够选择和组合所需的功能,而不是被迫使用一个大而全的框架。

在这种背景下,Tom Christie 开发了 Starlette,作为一个轻量级、模块化、异步友好的 Python web 框架。Starlette 旨在满足现代 web 开发的需求,为构建 API 和高性能应用程序提供一个优秀的选择。

特点

ASGI 支持

Starlette 完全支持 ASGI 规范,这使得它能够与 ASGI 服务器(如 Uvicorn、Daphne 等)无缝集成,提高了应用程序的并发性和性能。

快速和简单

Starlette 旨在保持简单和高效,并提供一组精心设计的核心功能,以快速构建 web 应用程序。

异步支持

Starlette 充分利用 Python 的异步特性,允许你编写高度并发的应用程序。

模块化设计

Starlette 采用模块化设计,使你可以灵活地选择和组合所需的功能,比如路由、模板引擎、数据库访问等。

可扩展性

Starlette 提供了一个易于扩展的插件系统,使开发者可以轻松地添加自定义组件和功能。

测试支持

Starlette 内置了对测试的良好支持,使得编写和运行自动化测试变得更加容易。

安全性

Starlette 提供了一些内置的安全功能,如 CSRF 保护、CORS 支持等,帮助开发者构建更安全的应用程序。

广泛的第三方库支持

Starlette 可以与许多第三方库无缝集成,如 SQLAlchemy、Tortoise ORM、Pydantic 等,扩展了它的功能范围。

请求数据流

ASGI 服务器接收请求

客户端发起 HTTP 请求,ASGI 服务器(如 Uvicorn、Daphne)接收并解析这个请求。

路由匹配

Starlette 的路由系统会根据请求的 URL 路径和方法,匹配到对应的路由处理函数。

中间件处理

在路由处理函数执行之前,Starlette 会执行一系列的中间件(Middleware)。中间件可以对请求和响应数据进行处理和验证。

请求对象处理

Starlette 会将 ASGI 请求数据封装为一个 Request 对象,为开发者提供一个便利的接口来访问请求数据,如请求头、查询参数、请求体等。

路由处理函数执行

匹配到的路由处理函数会被执行,开发者在这里编写具体的业务逻辑,对请求进行处理并生成响应。

响应对象生成

路由处理函数返回一个 Response 对象,Starlette 会将其转换为 ASGI 兼容的响应数据。

中间件后处理

Starlette 会再次执行一系列的中间件,对响应数据进行进一步的处理。

ASGI 服务器返回响应

最终,ASGI 服务器会将处理好的响应数据返回给客户端。

应用场景

API 服务

Starlette 非常适合开发 RESTful API 和 GraphQL API 服务。它提供了路由、参数解析、响应生成等所需的核心功能,同时也支持异步编程,可以轻松构建高性能的 API 服务。

微服务架构

由于 Starlette 的模块化设计和轻量级特点,它非常适合用于构建基于微服务架构的应用程序。开发者可以使用 Starlette 开发各个独立的微服务,并将它们组装成一个完整的应用。

实时应用

Starlette 的异步特性使它非常适合开发实时应用程序,如聊天应用、实时数据可视化等。开发者可以利用 WebSocket 等协议实现低延迟的双向通信。

数据密集型应用

Starlette 的异步设计使它能够高效地处理大量的 I/O 密集型任务,如文件上传/下载、数据库操作等。这使 Starlette 非常适合开发数据密集型的 web 应用程序。

后台任务

Starlette 可以方便地集成异步任务队列系统,如 Celery 或 RQ,用于执行后台任务。这使得 Starlette 可以用于构建复杂的、需要异步处理的 web 应用程序。

小型 web 应用程序

尽管 Starlette 的主要定位是 API 服务和微服务,但它也可以用于开发小型的 web 应用程序。它提供了模板引擎、静态文件服务等常见功能,能满足简单 web 应用的需求。

简单实例

from starlette.applications import Starlette
from starlette.requests import Request
from starlette.responses import JSONResponse
from starlette.routing import Route
from starlette.middleware import Middleware
from starlette.middleware.cors import CORSMiddleware
import asyncio
import aioredis
import databases
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from typing import List, Optional# 定义数据库模型
metadata = sqlalchemy.MetaData()
users = sqlalchemy.Table("users",metadata,sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),sqlalchemy.Column("name", sqlalchemy.String),sqlalchemy.Column("email", sqlalchemy.String),
)# 初始化数据库连接
database = databases.Database("sqlite:///database.db")
engine = sqlalchemy.create_engine("sqlite:///database.db")
Session = sessionmaker(bind=engine)# 初始化 Redis 连接
redis = aioredis.from_url("redis://localhost")# 定义中间件
class AuthMiddleware:async def __call__(self, request: Request, call_next):# 验证请求头中的 Authorization tokentoken = request.headers.get("Authorization")if not await self.verify_token(token):return JSONResponse({"error": "Unauthorized"}, status_code=401)return await call_next(request)async def verify_token(self, token: str):# 从 Redis 中验证 token 是否有效if await redis.get(f"token:{token}"):return Truereturn False# 定义路由处理函数
async def list_users(request: Request):# 从数据库查询用户列表async with Session() as session:users_list = await session.execute(users.select())return JSONResponse([dict(row) for row in users_list])async def create_user(request: Request):# 从请求体中读取用户数据data = await request.json()name = data.get("name")email = data.get("email")# 将用户数据保存到数据库async with Session() as session:user = await session.execute(users.insert().values(name=name, email=email))await session.commit()return JSONResponse(dict(user.inserted_primary_key), status_code=201)async def get_user(request: Request):# 从路径参数中获取用户 IDuser_id = int(request.path_params["user_id"])# 从数据库查询用户详情async with Session() as session:user = await session.execute(users.select().where(users.c.id == user_id))user_data = dict(user.fetchone())return JSONResponse(user_data)# 定义路由表
routes = [Route("/users", list_users, methods=["GET"]),Route("/users", create_user, methods=["POST"]),Route("/users/{user_id:int}", get_user, methods=["GET"]),
]# 定义中间件列表
middleware = [Middleware(CORSMiddleware, allow_origins=["*"]),Middleware(AuthMiddleware),
]# 创建 Starlette 应用程序
app = Starlette(routes=routes, middleware=middleware, on_startup=[database.connect], on_shutdown=[database.disconnect])

这个示例涵盖了 Starlette 请求数据流的各个环节:

定义数据库模型和连接
初始化 Redis 连接
定义中间件处理请求和响应
定义路由处理函数处理业务逻辑
创建 Starlette 应用程序并配置路由和中间件

这篇关于pythonweb之Starlette的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043477

相关文章

[PythonWeb:Django框架]:前后端请求调用;

文章目录 接着上篇项目app包下面创建static包,引入jquery,bootstrap 相关js文件views.py编写apicompute文件夹下面的urls.py路由模块引入views.py刚刚定义的函数html发送ajax请求 接着上篇 https://blog.csdn.net/Abraxs/article/details/138739727?spm=1001.201

pythonweb(1)

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler  #导入HTTP处理相关的模块 ModuleNotFoundError: No module named 'BaseHTTPServer' 这里是涉及到python3和python2的语法区别,我的pywebsocket是python2版本的,但是Python却是py

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 4.响应对象 5.视图快捷方法

不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette

transformers==4.30.2支持的SSE-Starlette版本是0.14.0

从0到1阿里云服务器部署pythonweb

前言:老早就想总结一下如何在服务器上部署pythinweb了,一直到现在才开始写,其实我不是一个有拖延症的人,只是高速的生活很容易让现代人迷失方向。 当你拥有一台服务器是可以做很多事情,我这里是部署了个人的pythonweb,内容主要是之前的那个基于中医药知识图谱的智能问答还有一些生活中一些有意思的东西。 技术路线是:flask+uwsgi+nginx,哈哈,很老了吧,现在不都流行dock

数据库开发中级案例—PythonWeb框架应用

目录 第1关 查询操作 使用SQLAlchemy实现 config.py __init__.py models.py test.py 头歌实验代码 第2关 增加操作 不使用SQLAlchemy实现 使用SQLAlchemy 头歌实验代码 第3关 删除操作 不使用SQLAlchemy实现 使用SQLAlchemy 使用 request 获取 get 请求的参数 头歌实

构建高效PythonWeb:GraphQL+Sanic

1.1 简介:在当今快速发展的技术时代,Web应用的性能和灵活性变得越来越重要。在众多技术中,GraphQL和Sanic以其独特的优势脱颖而出。GraphQL,作为一个强大的数据查询语言,为前端和后端之间的通信提供了极大的灵活性。而Sanic,则是一个快速的异步Web框架,专为快速HTTP响应设计。本文将探索如何将GraphQL与Sanic结合使用,以创建高效、灵活的Python Web应用。