开发 Python HTTP 服务器与 API 的笔记

开发 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值