杰瑞科技汇

python webservice接口

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

python webservice接口-图1
(图片来源网络,侵删)

下面我将分步介绍,并提供完整的代码示例。


核心概念

在开始之前,我们先明确几个关键概念:

  1. 框架:一个提供基础结构和工具的库,让你不必从零开始写所有代码。
    • Flask:轻量级、灵活、易于上手,适合小型项目或微服务。
    • Django:功能全面的“大而全”框架,自带了强大的后台管理系统,其 Django REST framework (DRF) 是构建 RESTful API 的行业标准。
  2. HTTP 方法:定义了对资源的操作类型。
    • GET:获取资源。
    • POST:创建新资源。
    • PUT:更新整个资源。
    • PATCH:更新部分资源。
    • DELETE:删除资源。
  3. 端点:API 的 URL 路径,/users/users/123
  4. 序列化:将 Python 对象(如 dict 或模型实例)转换为 JSON 格式,以便通过网络传输,反之则为反序列化。

使用 Flask (推荐初学者)

Flask 非常简洁,只需几行代码就能启动一个 Web 服务。

安装 Flask

pip install Flask

创建一个简单的 "Hello World" API

这是一个最基础的 API,只有一个端点。

python webservice接口-图2
(图片来源网络,侵删)

创建一个文件 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

你会看到类似这样的输出:

python webservice接口-图3
(图片来源网络,侵删)
 * 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

配置项目

  1. 编辑 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',
    ]
  2. 创建序列化器: 在 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']
  3. 定义模型: 编辑 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
  4. 创建视图: 编辑 books/views.py,DRF 提供了强大的 APIViewModelViewSet,可以自动生成 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
  5. 配置 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 是不二之选。
分享:
扫描分享到社交APP
上一篇
下一篇