开发 Python HTTP 服务器与 API 的笔记
使用Python开发HTTP 服务器和 API(应用程序编程接口)学习如何使用 Flask 框架开发一个简单的 HTTP 服务器和 API。
1. 什么是 HTTP 服务器?
简单的说 HTTP 服务器是一个处理客户端请求并返回响应的程序。它可以处理 GET、POST、PUT 和 DELETE 等请求方法。服务器可用于提供网页、API 接口或者文件下载等功能。
2. 什么是 API?
API(应用程序编程接口) 是服务器程序提供的一个可访问的功能资源链接。其他程序可以通过这个 API 获取相应的功能和数据返回。通过约定好的协议,应用之间形成了一种访问桥梁,使得不同应用之间可以进行交流操作. 比如: 服务器访问服务器功能, 客户端访问服务器功能等.
3. 环境准备
3.1 安装 Flask
首先,你需要确保已经安装 Python 和 pip。然后可以通过 pip 安装 Flask:
pip install Flask
如果电脑 python3和pip3命令用下面的
pip3 install Flask
3.2 创建项目目录
创建一个新的项目目录并进入该目录:
mkdir my_flask_app
cd my_flask_app
4. 创建基本的 Flask 应用
创建一个名为 app.py
的文件,并添加以下基本代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
# app.run(debug=True) # 默认端口 5000
4.1 运行应用
在命令行中运行以下命令启动 Flask 服务器:
python app.py
打开浏览器并访问 http://127.0.0.1:5000/
,你应该会看到 “Hello, World!” 的消息。
5. 开发 API
5.1 定义 API 路由
应用添加一些 API 路由。假设我们要创建一个用户 API,允许我们获取用户信息和创建新用户。
API 返回的结果 JSON, 使用GET请求获取数据, POST来设置数据.
更新 app.py
文件如下:
from flask import Flask, jsonify, request
app = Flask(__name__)
app.json.ensure_ascii = False # 确保中文原样输出. 避免 Unicode 字符被转义。 旧版本中: app.config[JSON_AS_ASCII]=False
# 假设这是数据库的数据与结构. 用全局属性来做测试.
users = [
{"name":"zhangsan", "age": 20},
{"name":"里斯", "age": 35}
]
# 获取所有用户
@app.route('/api/users', methods=['GET'])
def get_users():
return jsonify(users)
# 创建新用户
@app.route('/api/users', methods=['POST'])
def create_user():
# 比如数据: {"name":"xx", "age": 33}
data = request.json # 从请求中获取 JSON 数据
users.append(data) # 追加进去
return jsonify(data), 201 # 返回新用户和 201 状态码, 成功创建了一个资源.
if __name__ == '__main__':
app.run(debug=True) # debug=True 代码变化自动重启
5.2 测试 API
启动 Flask 服务器后,你可以使用 Postman 或 curl 测试 API。
- 获取所有用户(GET 请求):
curl -X GET http://127.0.0.1:5000/api/users
- 创建新用户(POST 请求):
curl -X POST -H "Content-Type: application/json" -d '{"name": "wangwu", "age":16}' http://127.0.0.1:5000/api/users
5.3 中文输出错误问题
JSON输出默认使用jsonify(data) 输出的情况, 有可能会遇到中文编码是\uxx的形式.
5.3.1 解决方案:
app.json.ensure_ascii = False
# 旧版本中: app.config[JSON_AS_ASCII]=False
5.3.2 其他中文编码解决方案:
| 可以导入 json 模块自行解析, 并创建Response的实例返回;
from flask import Flask, jsonify, request, Response
import json
# 省略其他代码
#...
# 假设数据
users = [{"name":"张三"}]
@app.route('/api/users', methods=['GET'])
def get_users():
# ensure_ascii=False 要设置这个.
data = json.dumps(users, ensure_ascii=False)
return Response(data, content_type="application/json")
# 省略其他代码
#...
6. 处理错误
在 API 开发中,处理错误是至关重要的。我们可以添加一些错误处理机制,例如:
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'Not found'}), 404
@app.errorhandler(400)
def bad_request(error):
return jsonify({'error': 'Bad request'}), 400
将这些错误处理器添加到 app.py
文件中,以便在请求错误时返回相应的 JSON 响应。
7. 使用 Flask-RESTful 扩展
Flask-RESTful 是一个帮助构建 REST API 的 Flask 扩展。可以通过以下命令安装:
pip install Flask-RESTful
或
pip3 install Flask-RESTful
7.1 使用 Flask-RESTful 创建 API
使用 Flask-RESTful 简化 API 创建的过程。以下是一个示例:
from flask import Flask, request
from flask_restful import Resource, Api
app = Flask(__name__)
app.json.ensure_ascii = False
api = Api(app)
users = [
{"name":"zhangsan", "age": 20},
{"name":"里斯", "age": 35}
]
# 继承 Resource , 重写 get,post之类的方法
class User(Resource):
def get(self):
return users
def post(self):
new_user = request.json
new_user['id'] = len(users) + 1
users.append(new_user)
return new_user, 201
# 设置资源路径与操作资源类的映射.
api.add_resource(User, '/api/users')
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'Not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
8. 结论
此笔记学习了如何使用 Flask 框架创建一个基本的 HTTP 服务器和 API。