杰瑞科技汇

Python如何创建WebService?

  • Flask: 轻量级、灵活,像一个工具箱,你可以按需添加组件,非常适合中小型项目、快速原型开发和微服务。
  • Django REST framework (DRF): 功能强大、全栈,内置了认证、权限、序列化、文档生成等大量功能,适合构建大型、复杂的 API 项目。

下面我将为你详细介绍这两种方法,并提供一个更简单的替代方案。

Python如何创建WebService?-图1
(图片来源网络,侵删)

使用 Flask (推荐初学者)

Flask 非常适合入门,因为它核心简单,易于理解。

安装 Flask

你需要安装 Flask 库,打开你的终端或命令行工具,运行:

pip install Flask

创建一个简单的 "Hello, World!" WebService

创建一个名为 app.py 的文件,并输入以下代码:

# app.py
from flask import Flask
# 创建一个 Flask 应用实例
app = Flask(__name__)
# 使用 @app.route 装饰器来定义 URL 路由
# '/' 是根路径
@app.route('/')
def hello_world():
    return 'Hello, World!'
# 运行这个 Flask 应用
# debug=True 可以在代码修改后自动重启服务器,并显示详细的错误信息
if __name__ == '__main__':
    app.run(debug=True)

运行和测试

  1. 在终端中,导航到 app.py 文件所在的目录。
  2. 运行脚本:
    python app.py
  3. 你会看到类似下面的输出,表示服务器已经启动:
     * Serving Flask app 'app'
     * Debug mode: on
     * Running on http://127.0.0.1:5000
    Press CTRL+C to quit
  4. 打开你的网页浏览器,访问 http://127.0.0.1:5000,你将看到 "Hello, World!"。

创建一个返回 JSON 数据的 API (WebService 的核心)

WebService 通常返回 JSON 格式的数据,下面我们创建一个提供用户信息的 API。

Python如何创建WebService?-图2
(图片来源网络,侵删)

修改 app.py 文件:

# app.py
from flask import Flask, jsonify
app = Flask(__name__)
# 模拟一个数据库
users = [
    {"id": 1, "name": "Alice", "email": "alice@example.com"},
    {"id": 2, "name": "Bob", "email": "bob@example.com"},
    {"id": 3, "name": "Charlie", "email": "charlie@example.com"}
]
# 获取所有用户
@app.route('/api/users', methods=['GET'])
def get_users():
    # jsonify 函数将 Python 字典或列表转换为 JSON 响应
    return jsonify(users)
# 根据 ID 获取单个用户
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    # 遍历用户列表,查找匹配 ID 的用户
    user = next((u for u in users if u['id'] == user_id), None)
    if user:
        return jsonify(user)
    else:
        # 如果用户不存在,返回 404 错误
        return jsonify({"error": "User not found"}), 404
if __name__ == '__main__':
    app.run(debug=True)

测试新的 API:

  1. 确保服务器正在运行 (python app.py)。
  2. 获取所有用户: 在浏览器或 API 客户端 (如 Postman) 中访问 http://127.0.0.1:5000/api/users
    • 响应: [{"email": "alice@example.com", "id": 1, "name": "Alice"}, ...]
  3. 获取单个用户: 访问 http://127.0.0.1:5000/api/users/2
    • 响应: {"email": "bob@example.com", "id": 2, "name": "Bob"}
  4. 获取不存在的用户: 访问 http://127.0.0.1:5000/api/users/99
    • 响应: {"error": "User not found"} (状态码为 404)

使用 Django REST framework (DRF)

如果你已经熟悉 Django 或者项目非常复杂,DRF 是一个更强大的选择。

安装 Django 和 DRF

pip install django
pip install djangorestframework

创建项目和应用

# 创建一个名为 myapi 的 Django 项目
django-admin startproject myapi
# 进入项目目录
cd myapi
# 创建一个名为 users 的应用
python manage.py startapp users

配置 settings.py

打开 myapi/settings.py 文件,进行以下修改:

Python如何创建WebService?-图3
(图片来源网络,侵删)
# myapi/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加 drf
    'rest_framework',
    # 添加我们的应用
    'users',
]

创建数据模型、序列化器和视图

a. 定义模型 (users/models.py)

# users/models.py
from django.db import models
class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    def __str__(self):
        return self.name

b. 创建数据库迁移

python manage.py makemigrations
python manage.py migrate

c. 创建序列化器 (users/serializers.py)

这是一个新文件,用于将模型实例转换为 JSON。

# users/serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'email']

d. 创建视图 (users/views.py)

DRF 提供了强大的 APIViewViewSet,这里我们用 ModelViewSet 可以自动创建列表、详情、创建、更新、删除等 API。

# users/views.py
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
    """
    自动提供 'list', 'create', 'retrieve', 'update', 'partial_update', 'destroy' 的动作。
    """
    queryset = User.objects.all().order_by('-id')
    serializer_class = UserSerializer

e. 配置 URL (myapi/urls.py)

# myapi/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    # 将 API 路由指向 users 应用的路由配置
    path('api/', include('users.urls')),
]

f. 为应用创建 URL (users/urls.py)

这是一个新文件,使用 DefaultRouter 可以自动为我们的 UserViewSet 生成 URL。

# users/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet
# 创建一个路由器并注册我们的 viewset
router = DefaultRouter()
router.register(r'users', UserViewSet)
# API URL 现在由路由器自动确定
urlpatterns = [
    path('', include(router.urls)),
]

运行和测试

  1. 启动开发服务器:
    python manage.py runserver
  2. 访问 API 端点:
    • 获取所有用户: http://127.0.0.1:8000/api/users/
    • 创建用户: 向 http://127.0.0.1:8000/api/users/ 发送一个 POST 请求,Body 中包含 JSON: {"name": "David", "email": "david@example.com"}
    • 获取单个用户: http://127.0.0.1:8000/api/users/1/
    • 更新用户: 向 http://127.0.0.1:8000/api/users/1/ 发送 PUT 或 PATCH 请求。
    • 删除用户: 向 http://127.0.0.1:8000/api/users/1/ 发送 DELETE 请求。

你还可以访问 http://127.0.0.1:8000/api/ 来查看 DRF 自动生成的 API 根目录。


使用 FastAPI (现代高性能方案)

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,它自动生成交互式 API 文档(Swagger UI),并且类型检查支持非常好。

安装 FastAPI 和 Uvicorn (ASGI 服务器)

pip install "fastapi[all]"

创建一个简单的 API

创建 main.py 文件:

# main.py
from fastapi import FastAPI
from pydantic import BaseModel
# 创建 FastAPI 应用实例
app = FastAPI()
# 定义一个数据模型,用于请求体验证
class User(BaseModel):
    id: int
    name: str
    email: str
# 模拟数据库
fake_users_db = [
    {"id": 1, "name": "Alice", "email": "alice@example.com"},
    {"id": 2, "name": "Bob", "email": "bob@example.com"},
]
@app.get("/")
def read_root():
    return {"Hello": "World"}
@app.get("/api/users/", response_model=list[User])
def read_users():
    return fake_users_db
@app.get("/api/users/{user_id}", response_model=User)
def read_user(user_id: int):
    user = next((u for u in fake_users_db if u["id"] == user_id), None)
    if not user:
        # FastAPI 会自动处理 404 错误
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="User not found")
    return user
@app.post("/api/users/", response_model=User)
def create_user(user: User):
    fake_users_db.append(user.model_dump())
    return user

运行和测试

  1. 在终端运行 Uvicorn 服务器:
    uvicorn main:app --reload
  2. 访问 http://127.0.0.1:8000
  3. 访问 交互式 API 文档: http://127.0.0.1:8000/docs,你可以直接在这个页面上测试你的 API!

总结与选择

特性 Flask Django REST framework (DRF) FastAPI
易用性 ⭐⭐⭐⭐⭐ (非常简单) ⭐⭐⭐ (概念较多) ⭐⭐⭐⭐ (直观,有类型提示)
性能 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ (基于 ASGI,非常快)
功能丰富度 ⭐⭐ (需要自己组合) ⭐⭐⭐⭐⭐ (开箱即用) ⭐⭐⭐⭐ (现代,功能强大)
自动文档 需要插件 (如 Flask-RESTx) ⭐⭐⭐⭐⭐ (内置) ⭐⭐⭐⭐⭐ (内置 Swagger UI)
学习曲线 平缓 陡峭 较平缓
适用场景 小型项目、微服务、快速原型 大型项目、企业级应用 现代高性能 API、微服务

给你的建议:

  • 如果你是初学者,或者只是想快速搭建一个简单的 API:从 Flask 开始,它足够简单且强大。
  • 如果你正在构建一个大型、需要长期维护的企业级应用:选择 Django REST framework,它的生态系统和内置功能会让你事半功倍。
  • 如果你追求极致的性能,喜欢现代的开发方式(如类型提示),并看重自动生成的文档:强烈推荐 FastAPI,它是目前非常热门的新选择。
分享:
扫描分享到社交APP
上一篇
下一篇