在现代软件开发中,"WebService" 通常指的是 RESTful API,它是一种基于 HTTP 协议,使用 JSON 或 XML 等格式进行数据交换的轻量级服务,Python 有多种强大的框架可以用来创建这种接口,其中最流行和易用的是 Flask 和 Django REST framework。

下面我将分步介绍,并提供完整的代码示例。
核心概念
在开始之前,我们先明确几个关键概念:
- 框架:一个提供基础结构和工具的库,让你不必从零开始写所有代码。
- Flask:轻量级、灵活、易于上手,适合小型项目或微服务。
- Django:功能全面的“大而全”框架,自带了强大的后台管理系统,其 Django REST framework (DRF) 是构建 RESTful API 的行业标准。
- HTTP 方法:定义了对资源的操作类型。
GET:获取资源。POST:创建新资源。PUT:更新整个资源。PATCH:更新部分资源。DELETE:删除资源。
- 端点:API 的 URL 路径,
/users或/users/123。 - 序列化:将 Python 对象(如
dict或模型实例)转换为 JSON 格式,以便通过网络传输,反之则为反序列化。
使用 Flask (推荐初学者)
Flask 非常简洁,只需几行代码就能启动一个 Web 服务。
安装 Flask
pip install Flask
创建一个简单的 "Hello World" API
这是一个最基础的 API,只有一个端点。

创建一个文件 app.py:
from flask import Flask, jsonify
# 创建一个 Flask 应用实例
app = Flask(__name__)
# 定义一个路由,当访问根路径 / 时,执行这个函数
@app.route('/')
def home():
return "欢迎使用我的 Python WebService!"
# 运行这个应用
if __name__ == '__main__':
# debug=True 会在代码修改后自动重载服务器
app.run(debug=True)
运行服务:
在终端中执行:
python app.py
你会看到类似这样的输出:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
测试接口:
打开浏览器访问 http://127.0.0.1:5000/,你会看到 "欢迎使用我的 Python WebService!"。
或者使用 curl 命令:
curl http://127.0.0.1:5000/
创建一个返回 JSON 数据的 API
这才是真正的 WebService 接口,我们使用 jsonify 来确保返回的是正确的 JSON 响应。
修改 app.py:
from flask import Flask, jsonify
app = Flask(__name__)
# 模拟一个数据库
books = [
{'id': 1, 'title': 'Python入门', 'author': '张三'},
{'id': 2, 'title': 'Flask实战', 'author': '李四'}
]
# GET /api/books - 获取所有书籍列表
@app.route('/api/books', methods=['GET'])
def get_books():
return jsonify(books)
# GET /api/books/<int:book_id> - 获取单本书籍的详情
@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
book = next((b for b in books if b['id'] == book_id), None)
if book is None:
# 如果找不到书籍,返回 404 错误
return jsonify({'error': '书籍未找到'}), 404
return jsonify(book)
# POST /api/books - 创建一本新书
@app.route('/api/books', methods=['POST'])
def create_book():
# 在实际应用中,数据应该从请求体中获取
# 这里为了简化,我们直接使用一个字典
if not request.json or not 'title' in request.json:
return jsonify({'error': '请求体必须包含 title'}), 400
new_book = {
'id': books[-1]['id'] + 1,
'title': request.json['title'],
'author': request.json.get('author', "匿名作者")
}
books.append(new_book)
return jsonify(new_book), 201 # 201 表示资源创建成功
# 启动应用
if __name__ == '__main__':
app.run(debug=True)
注意:上面的代码中 request 没有导入,请确保在文件顶部添加 from flask import request。
测试接口:
-
获取所有书籍:
curl http://127.0.0.1:5000/api/books
输出:
[ {"author": "张三", "id": 1, "title": "Python入门"}, {"author": "李四", "id": 2, "title": "Flask实战"} ] -
获取单本书籍 (ID=1):
curl http://127.0.0.1:5000/api/books/1
输出:
{"author": "张三", "id": 1, "title": "Python入门"} -
获取不存在的书籍 (ID=99):
curl http://127.0.0.1:5000/api/books/99
输出:
{"error": "书籍未找到"} -
创建新书:
curl -X POST -H "Content-Type: application/json" -d '{"title": "Django权威指南", "author": "王五"}' http://127.0.0.1:5000/api/books输出:
{"author": "王五", "id": 3, "title": "Django权威指南"}
使用 Django REST framework (DRF)
如果你已经在使用 Django,或者你的项目非常复杂,需要数据验证、权限控制等高级功能,DRF 是最佳选择。
安装 Django 和 DRF
pip install django pip install djangorestframework
创建项目和应用
# 创建一个名为 myproject 的项目 django-admin startproject myproject # 进入项目目录 cd myproject # 创建一个名为 books 的应用 python manage.py startapp books
配置项目
-
编辑
myproject/settings.py:- 添加
'rest_framework'到INSTALLED_APPS。 - 注册新创建的
books应用。
# myproject/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 添加 rest_framework 'rest_framework', # 添加 books 应用 'books', ] - 添加
-
创建序列化器: 在
books应用目录下创建一个新文件serializers.py。# books/serializers.py from rest_framework import serializers from .models import Book # 我们将在下一步创建这个模型 class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = ['id', 'title', 'author'] -
定义模型: 编辑
books/models.py。# books/models.py from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) def __str__(self): return self.title -
创建视图: 编辑
books/views.py,DRF 提供了强大的APIView和ModelViewSet,可以自动生成list,create,retrieve,update,destroy等操作。# books/views.py from rest_framework import viewsets from .models import Book from .serializers import BookSerializer # ModelViewSet 自动为处理列表、创建、检索、更新、删除等操作 class BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all().order_by('-id') serializer_class = BookSerializer -
配置 URL: 编辑
myproject/urls.py。# myproject/urls.py from django.contrib import admin from django.urls import path, include # 导入 DRF 的路由器 from rest_framework.routers import DefaultRouter from books.views import BookViewSet # 创建一个路由器并注册我们的视图集 router = DefaultRouter() router.register(r'books', BookViewSet, basename='book') urlpatterns = [ path('admin/', admin.site.urls), # 将 API 的 URL 路由包含进来 path('', include(router.urls)), ]
运行和迁移数据库
# 创建数据库迁移文件 python manage.py makemigrations # 应用迁移,在数据库中创建表 python manage.py migrate # 启动开发服务器 python manage.py runserver
测试 DRF API
DRF 默认提供了一个非常棒的 Web API 浏览器,你可以在浏览器中访问 http://127.0.0.1:8000/,然后点击 API 链接,就能看到一个可视化的界面,可以直接在这里测试你的 API。
你也可以使用 curl 来测试:
-
获取所有书籍列表:
curl http://127.0.0.1:8000/books/
输出 (初始为空):
[]
-
创建新书 (POST):
curl -X POST -H "Content-Type: application/json" -d '{"title": "Flask vs Django", "author": "赵六"}' http://127.0.0.1:8000/books/输出:
{ "id": 1, "title": "Flask vs Django", "author": "赵六" } -
获取单本书籍 (GET):
curl http://127.0.0.1:8000/books/1/
输出:
{ "id": 1, "title": "Flask vs Django", "author": "赵六" }
总结与对比
| 特性 | Flask | Django REST Framework |
|---|---|---|
| 易用性 | 非常简单,几行代码就能跑起来,学习曲线平缓。 | 相对复杂,需要理解 Django 的项目结构(MTV)。 |
| 灵活性 | 极高,核心非常小,想用什么库就用什么库,自由度大。 | 功能强大且内置,但也意味着有“Django 的方式”,灵活性稍低。 |
| 功能 | 需要自己寻找和集成第三方库来实现高级功能(如认证、权限)。 | 开箱即用,提供强大的认证、权限、限流、文档等工具。 |
| 适用场景 | - 微服务 - 小型项目 - API 原型 - 需要高度定制化的项目 |
- 大型、复杂的 Web 项目 - 需要快速构建功能完善的 API - 团队已有 Django 使用经验 |
| 性能 | 两者性能都非常优秀,通常瓶颈在于业务逻辑而非框架本身。 | 两者性能都非常优秀,通常瓶颈在于业务逻辑而非框架本身。 |
如何选择?
- 如果你是初学者,或者只是想快速搭一个简单的 API,或者你的项目很小,从 Flask 开始是最佳选择。
- 如果你正在构建一个大型、企业级的应用,或者你的团队已经在使用 Django,或者你需要非常完善的 API 功能(如自动生成文档、权限控制),Django REST framework 是不二之选。
