五分钟看懂 Flask + Celery:超简单的一个代码文件可演示用法

在这里插入图片描述

  1. 目标
    把“算斐波那契”扔后台,页面秒回任务 ID,5 分钟搞定。

  2. 目录(全部 4 个文件)

.
├── requirements.txt   # 依赖
├── app.py            # 所有代码
├── api.http          # REST-Client 测试
└── readme.md         # 启动命令
  1. 文件内容(直接复制即可)

requirements.txt

Flask==2.3.3
celery==5.3.4
redis==5.0.1
python-dotenv==1.0.0

app.py

# 安装依赖:
#   pip install flask celery redis
# 运行方式:
#   1) 先启 Redis(默认 localhost:6379)
#       redis-server
#   2) 启动 Celery worker(在项目目录下执行)
#       celery -A this_file_name:celery worker --loglevel=info
#   3) 另开终端启动 Flask
#       python this_file_name.py
#   4) 浏览器访问 http://127.0.0.1:5000/?n=8 
#      后台会异步计算斐波那契数,页面立即返回任务 ID。

from flask import Flask, request, jsonify
from celery import Celery

app = Flask(__name__)

# Celery 配置(使用 Redis 当 broker 和 backend)
app.config["CELERY_BROKER_URL"] = "redis://localhost:6379/0"
app.config["CELERY_RESULT_BACKEND"] = "redis://localhost:6379/0"

# 初始化 Celery
celery = Celery(app.name, broker=app.config["CELERY_BROKER_URL"])
celery.conf.update(app.config)


# 定义一个异步任务
@celery.task(bind=True)
def fib(self, n: int) -> int:
    """计算斐波那契数(演示用)"""
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a


# 一个简单路由,接收参数 n,把任务丢给 Celery
@app.route("/")
def index():
    try:
        n = int(request.args.get("n", 10))
    except ValueError:
        return "参数 n 必须是整数", 400
    task = fib.delay(n)
    return jsonify(task_id=task.id)


# 可选:查询任务结果
@app.route("/result/<task_id>")
def result(task_id):
    task = fib.AsyncResult(task_id)
    if task.ready():
        return jsonify(status="SUCCESS", result=task.result)
    return jsonify(status="PENDING")


if __name__ == "__main__":
    app.run(debug=True)

api.http

### 计算斐波那契数列第10项
GET http://127.0.0.1:5000/?n=10 
Accept: application/json

### 使用默认参数 n=10 计算斐波那契数列
GET http://127.0.0.1:5000/ 
Accept: application/json

### 计算斐波那契数列第15项
GET http://127.0.0.1:5000/?n=15 
Accept: application/json

### 计算斐波那契数列第5项
GET http://127.0.0.1:5000/?n=5 
Accept: application/json

### 测试无效参数(应返回400错误)
GET http://127.0.0.1:5000/?n=abc 
Accept: application/json

### 查询任务执行结果(需替换 {task_id} 为实际返回的task_id)
GET http://127.0.0.1:5000/result/ {task_id}
Accept: application/json

readme.md

# 启动命令
# 创建并激活 venv
python3 -m venv .venv
source .venv/bin/activate   # Windows 用 .venv\Scripts\activate

# 装包
pip install -r requirements.txt

# 终端 A:启动 celery worker
celery -A app.celery worker --loglevel=info

# 终端 B:启动 flask
python app.py
  1. 一键跑(完整复制)
# 1. 创建并激活 venv
python3 -m venv .venv
source .venv/bin/activate      # Windows 用 .venv\Scripts\activate

# 2. 装依赖
pip install -r requirements.txt

# 3. 开两个终端
# 终端 A ── 启动 celery
celery -A app.celery worker --loglevel=info
# 终端 B ── 启动 flask
python app.py
  1. 测试
    浏览器或 REST 客户端访问:
    http://127.0.0.1:5000/?n=10
    → 立即拿到任务 ID
    http://127.0.0.1:5000/result/<task_id>
    → 拿到结果 55

  2. 收工
    页面秒响应,计算在后台。


以我之思,借AI之力

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值