Python: 创建一个REST API

如何使用Flask创建REST API

👋 欢迎来到 Stackhero 文档!

Stackhero 提供现成的 Python 云 解决方案,具有众多优势,包括:

  • 通过简单的 git push 在几秒钟内 部署您的应用程序。
  • 使用您自己的域名,并享受 HTTPS 证书的自动配置以增强安全性。
  • 享受 自动备份一键更新,以及简单、透明和可预测的定价,让您高枕无忧。
  • 通过私有和专用的 VM获得最佳的性能和强大的安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Python 云托管 解决方案!

本文档是一个关于在Python中创建REST API的入门指南。

在这个例子中,我们使用Flask,一个轻量且易于使用的微框架,可以让您快速创建Web应用程序。

在开始之前,请确保您的计算机配备以下工具:

  1. Python
  2. pip
  3. git
  4. asdf

如果您的开发环境尚未设置,请参考开发平台指南获取详细说明。或者,您可以使用在线Code-Hero平台。Code-Hero提供了一个在线IDE和终端,预装了所有必要的工具,您可以立即开始编码,无需安装。

Python REST API在Code-Hero中运行,可直接从浏览器访问Python REST API在Code-Hero中运行,可直接从浏览器访问

第一步是创建一个新的项目目录。在本指南中,我们将其命名为myRestApi

mkdir myRestApi
cd myRestApi

接下来,使用asdf将Python版本设置为最新可用版本,并初始化Git仓库:

asdf install python latest \
  && asdf local python latest

echo "__pycache__/" >> .gitignore

git init
git add -A .
git commit -m "First commit"

在这个例子中,我们只需要一个依赖:Flask。

Flask是一个轻量级的Web框架,可以快速开发Web应用程序。它设计简单易用,使开发人员能够快速构建和部署Web服务。内置的路由、模板和HTTP请求处理支持,使Flask成为创建REST API的绝佳选择。

使用pip安装Flask(和python-dotenv):

pip install Flask python-dotenv

我们在这里安装了Flaskpython-dotenv模块。您将很快看到我们使用python-dotenv的原因(提示:用于管理环境变量)。

安装后,将包版本冻结到requirements.txt文件中:

pip freeze > requirements.txt

冻结您的依赖项可以确保您的生产服务器或同事使用与您相同的版本。只需几秒钟的工作就可以避免许多未来的麻烦。

现在,让我们深入代码!

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

import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request

# 在非生产环境中从.env文件加载环境变量
if os.environ.get('ENV') != 'production':
    load_dotenv()

# 创建Flask应用
app = Flask(__name__)

# 示例数据集
tasks = [
    {
        'id': 1,
        'title': '买杂货',
        'description': '牛奶,奶酪,披萨,水果',
        'done': False
    },
    {
        'id': 2,
        'title': '学习Python',
        'description': '学习Python编程基础',
        'done': False
    }
]

# 路由'/api/tasks' (GET) 列出所有任务
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

# 路由'/api/tasks/<task_id>' (GET) 根据ID获取特定任务
@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if len(task) == 0:
        return jsonify({'error': '任务未找到'}), 404
    return jsonify({'task': task[0]})

# 路由'/api/tasks' (POST) 创建新任务
@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': '标题是必需的'}), 400
    task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

# 启动API服务器
if __name__ == '__main__':
    if os.environ.get('ENV') == 'production':
        app.run()
    else:
        app.run(host='0.0.0.0', port=8080, debug=True)

要启动服务器,请运行:

python app.py

使用host='0.0.0.0'选项,您还可以在使用Code-Hero时通过浏览器访问您的API。只需导航到http://<XXXXXX>.stackhero-network.com:8080/api/tasks,将<XXXXXX>替换为您的Code-Hero域名。

服务器运行后,您可以使用cURL与其交互。以下是一些示例:

  • 检索所有任务:

    curl -s http://localhost:8080/api/tasks
    {
      "tasks": [
        {
          "description": "牛奶,奶酪,披萨,水果",
          "done": false,
          "id": 1,
          "title": "买杂货"
        },
        {
          "description": "学习Python编程基础",
          "done": false,
          "id": 2,
          "title": "学习Python"
        }
      ]
    }
    
  • 检索ID为2的任务:

    curl -s http://localhost:8080/api/tasks/2
    {
      "task": {
        "description": "学习Python编程基础",
        "done": false,
        "id": 2,
        "title": "学习Python"
      }
    }
    
  • 创建新任务:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "新任务", "description": "使用cURL创建"}' \
    http://localhost:8080/api/tasks
    {
      "task": {
        "description": "使用cURL创建",
        "done": false,
        "id": 3,
        "title": "新任务"
      }
    }
    

提示:将输出通过jq管道以美化JSON。例如,curl -s http://localhost:8080/api/tasks/2 | jq会生成更易读的结果。

使用Flask的Python REST API示例,在Stackhero Code-Hero中运行,服务器(1)和使用cURL的客户端(2)使用Flask的Python REST API示例,在Stackhero Code-Hero中运行,服务器(1)和使用cURL的客户端(2)

环境变量对于保护敏感信息(如数据库凭据或API密钥)至关重要。使用环境变量有两个主要好处:

  1. 您的秘密不会存储在Git仓库中,确保即使未经授权的人访问您的源代码,他们也无法访问您的敏感数据。
  2. 您可以为不同的环境使用不同的凭据(例如,生产与开发)。

为了管理环境变量,我们使用python-dotenv模块。首先,如果尚未安装,请安装它:

pip install python-dotenv
pip freeze > requirements.txt

接下来,在项目根目录创建一个.env文件,并添加您的开发环境变量。例如:

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"

最后,将.env文件添加到您的.gitignore中以保持安全:

echo ".env" >> .gitignore

要在Python中访问这些环境变量,只需使用os.environ.get()

import os

print(os.environ.get('ENV'))

.env文件仅用于开发环境。对于预发布或生产环境,请在Stackhero仪表板的Python服务配置中设置环境变量。

虽然本指南使用Flask的内置开发服务器,但在生产中,使用生产就绪的WSGI服务器(如Gunicorn)是必不可少的。请按照以下步骤操作:

  1. 安装Gunicorn:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. 使用app:app参数启动您的应用(其中第一个app是文件名,第二个app是Flask实例):

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    
  3. 创建一个Makefile以简化开发和生产模式之间的切换:

    .DEFAULT_GOAL := dev
    
    # 默认情况下,Stackhero for Python执行"run"规则。我们将其覆盖以执行'prod'规则。
    run: prod
    
    prod:
     	ENV=production gunicorn app:app \
     	  --error-logfile - \
     	  -b 0.0.0.0:8080
    
    dev:
     	python app.py
    

您可以使用make dev(或简单地make)在开发模式下运行服务器,并使用make prod在生产模式下运行。

部署Python项目的最简单方法是使用Stackhero Python云托管服务。主要功能包括:

  • 使用简单的git push进行部署
  • 可定制的域名,自动TLS证书管理(HTTPS)
  • 在专用的私有VM上运行,以实现最大安全性
  • 支持HTTP/2、TLS 1.3(HTTPS)、WebSockets、GZIP和Brotli压缩、ETag以及TCP/UDP端口访问

要将代码部署到Stackhero,请按照以下步骤操作:

  1. 使用以下命令检索您的公钥:

    cat ~/.ssh/id_*.pub
    
  2. 在Stackhero仪表板中,转到您的"Stackhero for Python"服务并点击"配置"按钮。

  3. 从第一步复制公钥并粘贴到"SSH公钥"或"Key"字段中。

  4. 点击页面底部的"验证"按钮以验证配置。

"Stackhero for Python"公钥配置"Stackhero for Python"公钥配置

没有SSH密钥?通过运行以下命令创建它们:

ssh-keygen -t ed25519

最后,配置您的仓库以部署到Stackhero。在您的项目文件夹中,使用Stackhero服务中提供的命令添加Git远程(将<XXXXXX>替换为您的服务域名):

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

Git远程命令Git远程命令

一切配置完成后,只需一个命令即可将代码部署到生产环境:

git push stackhero main

确保在将代码推送到生产环境之前添加并提交您的更改。在Stackhero Code-Hero中,您可以使用命令面板快速提交更改(在Windows/Linux上按Ctrl+Shift+P或在macOS上按Cmd+Shift+P并输入Git: Commit)。

部署后,访问您的API URL https://<XXXXXX>.stackhero-network.com/api/tasks(将<XXXXXX>替换为您的服务域名)以查看您的Flask API运行情况。

通过遵循本指南,您现在了解如何使用Flask创建REST API。凭借这些知识,您可以自信地开发和扩展您的RESTful应用程序,并将其与各种前端和后端服务集成。