欢迎访问宙启技术站
智能推送

Starlette框架的入门教程

发布时间:2024-01-13 02:12:35

Starlette是一个轻量级的异步Python web框架,非常适合构建高性能和可扩展的API服务。本教程将带您了解Starlette的基本概念和使用方法,并附带使用例子。

第1步:安装Starlette

在开始教程之前,首先需要安装Starlette。可以使用pip命令进行安装:

pip install starlette

成功安装后,我们可以开始编写 个Starlette应用程序。

第2步:编写 个Starlette应用程序

创建一个名为app.py的文件,并在其中导入Starlette模块:

from starlette.applications import Starlette

然后,创建一个Starlette应用程序的实例:

app = Starlette()

接下来,我们定义一个路由处理程序,它将处理来自根URL的请求:

from starlette.responses import PlainTextResponse

async def homepage(request):
    return PlainTextResponse('Hello, World!')

app.add_route('/', homepage)

在上面的代码中,我们使用PlainTextResponse类创建了一个简单的文本响应。homepage函数是一个异步函数,它接收一个request对象作为参数,该对象包含了客户端请求的信息。

最后,我们需要在文件的末尾添加以下代码来启动应用程序:

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

以上代码使用Uvicorn作为应用程序服务器,并将应用程序绑定到0.0.0.0:8000端口。

第3步:运行应用程序

要运行应用程序,只需在终端中执行以下命令:

python app.py

您应该看到类似以下输出:

INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [12345]

现在,您可以在浏览器中打开 http://localhost:8000 ,应该能够看到“Hello, World!”的响应。

第4步:添加更多的路由

Starlette提供了一种方便的方式来定义多个路由。我们可以使用装饰器来定义路由处理程序,例如:

@app.route('/hello/{name}')
async def hello(request):
    name = request.path_params['name']
    return PlainTextResponse(f'Hello, {name}!')

上面的代码定义了一个名为hello的路由处理程序,并在URL路径中接收一个名为name的参数。在函数体内,我们通过request.path_params['name']获取了该参数的值,并在响应中返回了带有该参数值的消息。

第5步:处理请求体

除了可以处理URL参数外,Starlette还允许我们处理请求体中的数据。例如,我们可以使用request对象的json()方法来解析JSON格式的请求体数据:

@app.route('/echo', methods=['POST'])
async def echo(request):
    data = await request.json()
    return JSONResponse(data)

上面的代码定义了一个名为echo的路由处理程序,并将其限制为仅接受POST请求。在函数体内,我们使用await request.json()来解析JSON数据,并将其作为响应返回。

第6步:处理响应

除了返回PlainTextResponseJSONResponse对象之外,Starlette还允许我们返回其他类型的响应。例如,我们可以使用HTMLResponse类返回HTML内容:

from starlette.responses import HTMLResponse

@app.route('/hello/{name}')
async def hello(request):
    name = request.path_params['name']
    html_content = f'<h1>Hello, {name}!</h1>'
    return HTMLResponse(html_content)

上面的代码定义了一个名为hello的路由处理程序,并在响应中返回一个包含动态生成的HTML内容的HTMLResponse对象。

第7步:使用中间件

Starlette还提供了中间件机制,可以在请求和响应之间添加额外的功能。例如,我们可以使用Middleware类来添加日志记录功能:

from starlette.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware

class LoggingMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        print(f'Received request: {request.method} {request.url.path}')
        response = await call_next(request)
        print(f'Sent response: {response.status_code}')
        return response

middleware = [
    Middleware(LoggingMiddleware)
]

app = Starlette(middleware=middleware)

上述代码定义了一个日志记录中间件类,并添加到了Starlette应用程序中。

通过添加中间件,我们可以在每个请求进入和离开应用程序时进行日志记录。

第8步:异常处理

在处理请求时,我们可能希望捕获并处理一些异常。Starlette允许我们使用HTTPException类来返回具体的错误状态码和错误信息:

from starlette.exceptions import HTTPException
from starlette.responses import JSONResponse

@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
    return JSONResponse({'error': str(exc)}, status_code=exc.status_code)

上述代码定义了一个异常处理程序,在遇到HTTPException异常时返回JSON格式的错误响应。

第9步:性能优化

对于高性能的应用程序,我们可能需要对Starlette进行一些性能优化。例如,我们可以使用Starlette类的on_event装饰器来添加在启动和关闭应用程序时执行的任务:

@app.on_event('startup')
async def startup():
    print('Application started')

@app.on_event('shutdown')
async def shutdown():
    print('Application stopped')

上述代码定义了两个事件处理程序,在应用程序启动和关闭时分别打印一条消息。

其他的性能优化措施包括使用异步后端数据库驱动程序、使用缓存等。

结论

在本教程中,我们了解了如何使用Starlette构建一个简单的Web应用程序,并了解了Starlette的基本概念和使用方法。我们还通过使用不同的例子演示了如何处理URL参数、请求体数据、响应以及使用中间件等。这些只是Starlette的一部分功能,该框架还提供了许多其他有用的功能,例如Websockets支持、认证和授权等。