Sanic简介
Sanic 是一个基于 Python 的现代异步 Web 框架,专为构建高性能 Web 应用而设计。它基于 asyncio,通过 async/await 语法支持高效处理数千个并发连接。Sanic 非常适合开发 REST API、微服务、实时应用和高负载后端系统。
Sanic 核心特性
性能与架构
Sanic 以执行速度为核心设计理念。该框架利用 asyncio 实现异步请求处理,性能可与 Node.js 和 Go 相媲美。内置的 async/await 支持让代码更易读、更高效。
功能亮点
- 开箱即用的 async/await 完全支持
- 带参数的路由和中间件
- 内置 WebSocket 支持
- 模板系统和静态文件处理
- 支持 CORS、Cookie 和会话管理
- 简洁清晰的项目结构
- API 服务器出色的可扩展性
安装与初始配置
基础安装
pip install sanic
额外依赖
pip install sanic[ext] # 扩展包
pip install jinja2 aiofiles python-dotenv
创建第一个应用
from sanic import Sanic
from sanic.response import text
app = Sanic("MyApp")
@app.get("/")
async def index(request):
return text("你好,Sanic!")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
路由与请求处理
基础路由
@app.get("/")
async def get_handler(request):
return text("GET 请求")
@app.post("/")
async def post_handler(request):
return text("POST 请求")
@app.put("/")
async def put_handler(request):
return text("PUT 请求")
@app.delete("/")
async def delete_handler(request):
return text("DELETE 请求")
异步路由
import asyncio
@app.get("/async")
async def async_route(request):
await asyncio.sleep(1) # 模拟异步操作
return text("异步响应")
参数与数据处理
路由参数
@app.get("/user/<user_id:int>")
async def get_user(request, user_id):
return text(f"用户ID: {user_id}")
@app.get("/profile/<username:str>")
async def get_profile(request, username):
return text(f"个人资料: {username}")
查询参数
@app.get("/search")
async def search(request):
query = request.args.get("q", "无")
limit = request.args.get("limit", "10")
return text(f"搜索: {query}, 限制: {limit}")
JSON 和表单处理
from sanic.response import json
@app.post("/api/data")
async def receive_data(request):
data = request.json
return json({"received": data})
@app.post("/form")
async def handle_form(request):
username = request.form.get("username")
email = request.form.get("email")
return json({"username": username, "email": email})
响应类型
多种响应格式
from sanic.response import text, json, html, redirect, file
@app.get("/text")
async def text_response(request):
return text("纯文本")
@app.get("/json")
async def json_response(request):
return json({"message": "JSON 响应"})
@app.get("/html")
async def html_response(request):
return html("<h1>HTML 页面</h1>")