☰
ChatGPT Plus/Pro 开通后 Codex 实战指南:用 Flask + CLI 从零跑通独立项目开发
2026/9/27 12:40:01 网站建设 项目流程

1. 为什么 Plus/Pro 用户该把 Codex 用起来

如果你刚开通 ChatGPT Plus 或 Pro,大概率第一件事是聊天、翻译、写文案。但真正能让订阅“回本”的,其实是 Codex 这个编程智能体。它和普通对话最大的区别在于:普通对话给你一段代码让你自己复制,Codex 直接在你的本地目录里读写文件、执行命令、跑测试,像一个坐在旁边的工程师,把项目一步步搭起来。

这篇不聊账号、不聊充值,只解决一件事:开通 Plus/Pro 之后,怎么用 Codex 从零跑通一个 Flask + Python CLI 的独立项目,并且把配置骨架固化下来,下次开新项目直接复用。适合三类人:刚拿到 Codex 权限不知道从哪下手的新手;写过 Flask 但没试过让 AI 接管终端的开发者;想把 Codex 接进日常编码流程、又不想每次重新配环境的人。

我会先给一份可复制的项目配置骨架(settings.json / config.toml),再带你走一遍“下达需求 → Codex 执行 → 本地验证 → 排错”的完整闭环。全程命令和参数都能直接抄,跑完你手里会有一个能增删改查、数据落盘的待办应用,以及一套能迁移到其他项目的配置模板。

2. 前置准备:Codex 入口与 TaoToken 接入

Codex 有两种用法:网页工作区和 CLI。网页版适合快速试水,CLI 版才是独立项目开发的主力,因为它直接跑在你的文件系统上,能操作你现有的任何仓库。安装 CLI 很直接:

npm install -g @openai/codex codex --version

如果你希望把模型调用统一走一个稳定的入口,方便管理密钥和用量,可以用 TaoToken 做接入层。它的 API 地址是https://taotoken.net/api,兼容常见的 OpenAI 风格调用方式。先去控制台建一个 Key:

  • 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
  • API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite

拿到 Key 之后,把它写进环境变量,不要硬编码进代码:

export TAOTOKEN_API_KEY="sk-你的key"

注意:Key 只放环境变量或本地配置文件,别提交到 Git。后面所有配置示例里我都用占位符,你替换成自己的即可。

如果你更想先在对话界面里验证模型是否正常,可以打开模型对话页试一句:

https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite

确认能正常返回后,再进入下面的项目配置环节。

3. 可复制的 Codex 项目配置骨架

这一节是全文的核心。Codex CLI 的行为由两个配置文件决定:项目级的config.toml和编辑器/工具侧的settings.json。把它们放对位置,Codex 才知道该用哪个模型、哪些目录能读写、哪些命令允许执行。

先建项目目录:

mkdir codex-flask-todo && cd codex-flask-todo git init mkdir -p .codex templates static

3.1 config.toml 示例

在项目根目录创建.codex/config.toml,这是 Codex CLI 读取的项目配置:

# .codex/config.toml model = "gpt-5-codex" approval_policy = "on-request" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" [sandbox] # 允许 Codex 在当前项目目录内读写 writable_roots = ["."] # 网络访问按需开启,跑 pip install 时需要 network_access = true [history] persistence = "save-all"

几个参数说明:approval_policy设成on-request表示 Codex 在执行有副作用的命令前会先问你,安全但不会太啰嗦;writable_roots限定在项目内,避免它误改系统文件;network_access在装依赖时打开,平时可以关掉。

3.2 settings.json 示例

如果你在 VS Code 或兼容编辑器里用 Codex 插件,项目根目录放.vscode/settings.json:

{ "codex.model": "gpt-5-codex", "codex.provider": "taotoken", "codex.baseUrl": "https://taotoken.net/api", "codex.autoApproveReadOnly": true, "codex.exclude": [ "**/.git/**", "**/node_modules/**", "**/__pycache__/**", "**/*.pyc" ], "codex.contextFiles": [ "app.py", "requirements.txt", "templates/**/*.html" ] }

exclude把无关目录挡在上下文之外,能明显减少 Codex 读错文件的情况;contextFiles是给它一个默认关注清单,开新会话时不用每次手动指定。

3.3 依赖与忽略文件

requirements.txt先写最小集合:

Flask==3.0.3 pytest==8.3.2

再建一个.codexignore,告诉 Codex 哪些东西别碰:

.git/ __pycache__/ *.pyc todos.json .env

配置就绪后,用一条命令验证 Codex 能读到项目配置:

codex --config .codex/config.toml "列出当前项目的文件结构,不要修改任何文件"

如果它能正确列出app.py、templates/等结构,说明配置生效了。

4. 用 Codex 跑通 Flask + CLI 项目

配置好了,接下来让 Codex 真正干活。我们的目标是:一个带网页界面的待办应用,支持添加、标记完成、删除,数据存本地 JSON,重启不丢。同时提供一个 Python CLI 入口,方便在终端里直接操作。

4.1 下达第一条需求

在项目目录里启动 Codex 交互会话:

codex

然后输入需求。注意,需求要具体,但不用指定实现细节:

请用 Python Flask 搭建一个待办事项应用,要求: 1. 添加待办事项 2. 标记完成/未完成 3. 删除事项 4. 数据保存到本地 todos.json,重启不丢失 5. 提供简洁的网页界面 6. 额外提供一个 CLI 入口 cli.py,支持 add/list/done/delete 四个子命令 请先创建项目结构,再逐步实现,每完成一个文件说明一下。

Codex 会先给出一个计划,然后开始创建app.py、templates/index.html、cli.py、requirements.txt。它执行pip install前会征求你同意,确认即可。

4.2 后端核心逻辑

Codex 生成的app.py大致长这样,你可以对照检查:

from flask import Flask, render_template, request, redirect, url_for import json import os app = Flask(__name__) DATA_FILE = "todos.json" def load_todos(): if not os.path.exists(DATA_FILE): return [] with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) def save_todos(todos): with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(todos, f, ensure_ascii=False, indent=2) @app.route("/") def index(): return render_template("index.html", todos=load_todos()) @app.route("/add", methods=["POST"]) def add(): content = request.form.get("content", "").strip() if content: todos = load_todos() todos.append({"id": len(todos) + 1, "content": content, "done": False}) save_todos(todos) return redirect(url_for("index")) @app.route("/toggle/<int:todo_id>") def toggle(todo_id): todos = load_todos() for todo in todos: if todo["id"] == todo_id: todo["done"] = not todo["done"] break save_todos(todos) return redirect(url_for("index")) @app.route("/delete/<int:todo_id>") def delete(todo_id): todos = [t for t in load_todos() if t["id"] != todo_id] save_todos(todos) return redirect(url_for("index")) if __name__ == "__main__": app.run(debug=True)

4.3 CLI 入口

cli.py是让这个项目从“网页 demo”升级为“可脚本化工具”的关键:

import argparse import json import os DATA_FILE = "todos.json" def load(): if not os.path.exists(DATA_FILE): return [] with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) def save(todos): with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(todos, f, ensure_ascii=False, indent=2) def main(): parser = argparse.ArgumentParser(description="待办事项 CLI") sub = parser.add_subparsers(dest="cmd", required=True) p_add = sub.add_parser("add") p_add.add_argument("content") sub.add_parser("list") p_done = sub.add_parser("done") p_done.add_argument("id", type=int) p_del = sub.add_parser("delete") p_del.add_argument("id", type=int) args = parser.parse_args() todos = load() if args.cmd == "add": todos.append({"id": len(todos) + 1, "content": args.content, "done": False}) save(todos) print(f"已添加: {args.content}") elif args.cmd == "list": for t in todos: mark = "x" if t["done"] else " " print(f"[{mark}] {t['id']}. {t['content']}") elif args.cmd == "done": for t in todos: if t["id"] == args.id: t["done"] = True save(todos) print(f"已完成: {args.id}") elif args.cmd == "delete": todos = [t for t in todos if t["id"] != args.id] save(todos) print(f"已删除: {args.id}") if __name__ == "__main__": main()

到这里,一个既能网页操作、又能终端脚本化的项目骨架就成型了。

5. 验证请求与成功结果

代码写完不算完,得跑起来验证。先装依赖:

pip install -r requirements.txt

启动 Flask:

python app.py

浏览器打开http://127.0.0.1:5000,添加几条事项、点完成、点删除,确认页面实时刷新,并且项目根目录出现了todos.json,内容类似:

[ { "id": 1, "content": "写 Codex 实战笔记", "done": false }, { "id": 2, "content": "跑通 CLI", "done": true } ]

再验证 CLI 是否和网页共享同一份数据:

python cli.py add "验证 CLI 写入" python cli.py list python cli.py done 1 python cli.py delete 2

如果list能看到网页里添加的事项,说明两条入口读写的是同一个todos.json,闭环成立。

最后让 Codex 补一套测试,确认核心逻辑可回归:

请为这个 Flask 应用编写 pytest 单元测试,覆盖添加、完成、删除三个功能,使用临时文件避免污染 todos.json。

生成后运行:

pytest -v

看到三个用例全部 PASS,这个项目就算真正跑通了。

6. 本篇常见错排查

报错一:ModuleNotFoundError: No module named 'flask'多半是虚拟环境没激活,或者pip装到了全局。先确认:

which python python -m pip install -r requirements.txt

用python -m pip而不是裸pip,能避免解释器错位。

报错二:Codex 改了不该改的文件检查.codex/config.toml里的writable_roots是否被改成了["/"]之类的大范围。恢复成["."],并在.codexignore里补上敏感目录。改动前先git commit,出问题直接git checkout .回滚。

报错三:todos.json中文乱码写入时没带ensure_ascii=False或没指定encoding="utf-8"。对照第 4.2 节的save_todos检查,两个参数缺一不可。

报错四:CLI 和网页数据对不上通常是工作目录不同,两个入口读到了不同的todos.json。统一在项目根目录执行命令,或者把DATA_FILE改成基于__file__的绝对路径:

DATA_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "todos.json")

报错五:Codex 执行命令一直卡在等待确认approval_policy设成了untrusted或默认值。改成on-request,只读操作会自动放行,写操作才询问。

排障过程中如果怀疑是 Key 或接入层的问题,可以去接入文档核对参数:

https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

7. 把配置迁移到下一个项目

这套骨架的价值在于可复用。下次开新项目,只需要三步:复制.codex/config.toml和.vscode/settings.json;按项目类型改contextFiles和requirements.txt;重新git init后让 Codex 读一遍结构。

如果你打算长期用 Codex 做编码和 Agent 类任务,可以了解一下 Coding Plan,它更适合高频、长会话的开发场景:

https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite

如果你用的是 Claude Code 那套工作流,想对比接入方式,可以看这份说明:

https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite

我自己的习惯是:每个新项目第一天就把config.toml和.codexignore建好,再让 Codex 读一遍目录结构。这样后面无论让它加功能还是排错,它都不会在无关文件上浪费上下文。配置先行,比事后补救省事得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询