Litefs 提供了一个现代、灵活的路由系统,支持多种路由定义方式和功能特性。
- ✅ 装饰器风格路由定义
- ✅ 方法链风格路由定义
- ✅ 路径参数支持(如
/user/{id}) - ✅ 多种 HTTP 方法支持(GET, POST, PUT, DELETE 等)
- ✅ 路由命名与反向解析
- ✅ 优先级路由匹配
- ✅ 静态文件路由支持
- ✅ 安全防护(防止路径遍历攻击)
from litefs import Litefs
from litefs.routing import get, post
app = Litefs()
# 定义 GET 路由
@get('/hello', name='hello')
def hello_handler(request):
return 'Hello, World!'
# 定义 POST 路由
@post('/form', name='form')
def form_handler(request):
return {'status': 'success', 'message': 'Form submitted'}
# 注册路由
app.register_routes(__name__)
app.run()from litefs import Litefs
app = Litefs()
# 定义 GET 路由
def hello_handler(request):
return 'Hello, World!'
# 定义 POST 路由
def form_handler(request):
return {'status': 'success', 'message': 'Form submitted'}
# 使用方法链添加路由
app.add_get('/hello', hello_handler, name='hello')
app.add_post('/form', form_handler, name='form')
app.run()from litefs.routing import get
@get('/user/{id}', name='user_detail')
def user_detail_handler(request, id):
return f'User ID: {id}'
@get('/user/{id}/posts/{post_id}', name='user_post')
def user_post_handler(request, id, post_id):
return f'User ID: {id}, Post ID: {post_id}'# 注册当前模块的路由
app.register_routes(__name__)
# 注册其他模块的路由
import routes_module
app.register_routes(routes_module)
# 注册模块名称字符串
app.register_routes('myapp.routes')Litefs 路由系统使用正则表达式进行路径匹配,支持:
- 精确匹配(如
/hello) - 路径参数(如
/user/{id}) - 优先级排序(更具体的路由优先匹配)
- 加载顺序匹配(按照路由定义的顺序进行匹配)
重要提示:Litefs 路由系统是根据路由定义的加载顺序进行匹配的。在注册路由时,建议:
- 先注册更具体的路由,再注册更通用的路由
- 避免路由路径重叠,如果必须重叠,确保具体的路由先被注册
- 注意模块导入顺序,因为不同模块的路由注册顺序会影响匹配结果
例如,以下定义顺序是正确的:
# 先注册具体路由
@get('/user/admin', name='admin_user')
def admin_user_handler(request):
return 'Admin User'
# 再注册通用路由
@get('/user/{id}', name='user_detail')
def user_detail_handler(request, id):
return f'User ID: {id}'如果顺序颠倒,/user/admin 会被 /user/{id} 匹配,因为它先被注册。
支持以下 HTTP 方法:
- GET
- POST
- PUT
- DELETE
- PATCH
- OPTIONS
- HEAD
# 定义命名路由
@get('/user/{id}', name='user_detail')
def user_detail_handler(request, id):
pass
# 反向解析 URL
url = app.router.url_for('user_detail', id=123) # 生成 '/user/123'Litefs 提供了静态文件路由功能,可以轻松地提供静态资源(如 CSS、JavaScript、图片等)。
from litefs import Litefs
app = Litefs()
# 添加静态文件路由
app.add_static('/static', './static', name='static')
# 访问静态文件
# http://localhost:8080/static/css/style.css
# http://localhost:8080/static/js/app.js
# http://localhost:8080/static/images/logo.png安全特性:
- 自动防止路径遍历攻击(如
../../../etc/passwd) - 自动检测 MIME 类型
- 支持 HEAD 和 GET 方法
- 自动处理 404 和 403 错误
目录结构示例:
project/
├── app.py
└── static/
├── css/
│ └── style.css
├── js/
│ └── app.js
└── images/
└── logo.png
在路由处理函数中,request 对象提供了以下属性:
- request.params:GET 参数(字典)
- request.data:POST 参数(字典)
- request.files:上传的文件(字典)
- request.body:原始请求体(字节)
- request.environ:WSGI 环境变量
- request.request_method:HTTP 方法
- request.path:请求路径
- request.headers:请求头
- request.route_params:路由路径参数
- 模块化:将路由按功能模块组织到不同文件中
- 命名规范:使用清晰、一致的路由命名
- 路径设计:使用 RESTful 风格的路径设计
- 路由顺序:将常用路由放在前面
- 路径复杂度:避免过于复杂的路径模式
- 缓存:路由系统内部使用缓存提高匹配速度
from litefs.exceptions import RouteNotFound
try:
route_match = app.router.match(path, method)
except RouteNotFound:
# 处理路由未找到的情况
passfrom litefs import Litefs
from litefs.routing import get, post
app = Litefs(
host='0.0.0.0',
port=8080,
debug=True
)
# 装饰器风格路由
@get('/', name='index')
def index_handler(request):
return 'Home Page'
@get('/user/{id}', name='user_detail')
def user_detail_handler(request, id):
return f'User: {id}'
@post('/login', name='login')
def login_handler(request):
username = request.data.get('username')
password = request.data.get('password')
return {'status': 'success', 'username': username}
# 方法链风格路由
def about_handler(request):
return 'About Page'
app.add_get('/about', about_handler, name='about')
# 注册路由
app.register_routes(__name__)
# 运行应用
app.run()import requests
# 测试 GET 路由
response = requests.get('http://localhost:8080/')
print(response.text) # 输出: Home Page
# 测试路径参数
response = requests.get('http://localhost:8080/user/123')
print(response.text) # 输出: User: 123
# 测试 POST 路由
response = requests.post('http://localhost:8080/login', data={'username': 'test', 'password': 'pass'})
print(response.json()) # 输出: {'status': 'success', 'username': 'test'}- WSGI 兼容:支持在 WSGI 服务器中使用
- ASGI 准备:为未来的 ASGI 支持做好准备
如果两个路由路径模式冲突,更具体的路由会优先匹配。例如:
/user/{id}会匹配/user/123/user/admin会优先匹配精确路径
路径参数默认是字符串类型,需要在处理函数中进行类型转换:
@get('/user/{id}')
def user_handler(request, id):
user_id = int(id) # 转换为整数
# 处理逻辑...静态文件路由支持子路径访问,例如:
app.add_static('/static', './static')
# 可以访问:
# /static/css/style.css
# /static/js/app.js
# /static/images/logo.png安全注意事项:
- 静态文件路由会自动阻止路径遍历攻击
- 确保静态文件目录权限正确
- 不要将敏感文件放在静态文件目录中
确保:
- 路由装饰器正确导入
- 路由处理函数正确定义
register_routes方法被调用- 模块名称或对象正确传递
Litefs 路由系统提供了一种现代、灵活的方式来定义和管理 HTTP 路由,支持多种路由定义方式和功能特性,同时保持与传统文件系统路由的兼容性。通过使用装饰器风格或方法链风格的路由定义,开发者可以更清晰、更高效地组织应用的路由结构。