知识

python3做一个web提供接口

时间:2010-12-5 17:23:32  作者:休闲   来源:时尚  查看:  评论:0
内容摘要:用 Flask 写一个接口,代码不超过 15 行。这就是 Python 做 Web 接口最直接的样子——不需要 Django 那一整套 ORM、模板、中间件,一个装饰器加一个函数就够了。 先装东西:

用 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 做这种事,优势就在这——想法到能跑的接口,中间几乎没有摩擦。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap