游客发表
用 Flask 写一个接口,供接代码不超过 15 行。供接这就是供接 Python 做 Web 接口最直接的样子——不需要 Django 那一整套 ORM、模板、供接中间件,供接一个装饰器加一个函数就够了。供接
先装东西:
pip install flask 然后建一个 app.py:
from flask import Flask,供接 jsonify, request app = Flask(__name__) @app.route('/api/user', methods=['GET']) def get_user(): uid = request.args.get('id', '1') return jsonify({ "id": uid, "name": "张三", "age": 28}) @app.route('/api/user', methods=['POST']) def create_user(): data = request.get_json() return jsonify({ "status": "ok", "received": data}), 201 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) 跑起来 python app.py,浏览器访问 http://localhost:5000/api/user?供接id=5,就能看到 JSON 返回。供接POST 接口用 curl 测试:
curl -X POST http://localhost:5000/api/user \ -H "Content-Type: application/json" \ -d '{ "name":"李四",供接"age":30}' Flask 默认单线程,开发够用,供接上线得换。供接生产环境我一般用 gunicorn 拉多个 worker:
pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app -w 4 是供接 4 个进程,数字按 CPU 核数来,供接一般 2 * 核数 + 1。供接注意 Flask 自带的 app.run() 别放生产,它那个警告不是吓唬人的。
接口一多,路由散落在各处就乱了。我习惯按业务拆 Blueprint:
from flask import Blueprint user_bp = Blueprint('user', __name__, url_prefix='/api/user') @user_bp.route('', methods=['GET']) def list_users(): return jsonify({ "users": []}) # app.py 里注册 app.register_blueprint(user_bp) 参数校验这块,手写 if not data.get('name') 很快会烦。用 Pydantic 或者 marshmallow 都行,我偏向 Pydantic,类型提示直接用:
from pydantic import BaseModel, ValidationError class UserIn(BaseModel): name: str age: int @app.route('/api/user', methods=['POST']) def create_user(): try: user = UserIn(**request.get_json()) except ValidationError as e: return jsonify({ "error": e.errors()}), 400 return jsonify(user.dict()), 201 返回格式统一也很重要。前端最烦的就是有的接口返回 { "data": ...},有的直接裸返回数组。我通常包一层:
def resp(data=None, code=0, msg="ok"): return jsonify({ "code": code, "msg": msg, "data": data}) 错误处理用 @app.errorhandler 兜底,别让 500 错误直接吐 HTML 堆栈给前端:
@app.errorhandler(500) def server_error(e): return jsonify({ "code": 500, "msg": "internal error"}), 500 跨域问题,前端本地调试必踩。装 flask-cors,两行搞定:
from flask_cors import CORS CORS(app) 生产别这么放飞,指定 origins 白名单。
数据库连接我用 SQLAlchemy 的 Core 层,不碰 ORM 那套关系映射。接口简单的时候,直接 text() 写 SQL 反而清楚:
from sqlalchemy import create_engine, text engine = create_engine('postgresql://user:pass@localhost/db') @app.route('/api/user/<int:uid>') def get_user(uid): with engine.connect() as conn: row = conn.execute( text("SELECT id, name FROM users WHERE id = :id"), { "id": uid} ).fetchone() if not row: return jsonify({ "code": 404, "msg": "not found"}), 404 return jsonify({ "code": 0, "data": dict(row._mapping)}) 性能上,Flask 同步框架,QPS 几百到一千左右。真要扛高并发,换 FastAPI 或者上异步方案。但大多数内部系统、中小项目,Flask 完全够,代码量少,调试直观,出问题一眼能定位。
最后提一句部署。Nginx 反代 gunicorn,静态文件交给 Nginx,动态请求转发到 127.0.0.1:5000。用 systemd 管理进程,别用 nohup & 那种土办法,重启服务器就没了。
整套下来,一个能用的 Web 接口服务,核心代码不到 100 行。Python 做这种事,优势就在这——想法到能跑的接口,中间几乎没有摩擦。
友情链接