当前位置:首页>python>Python 零基础100天—Day56 RESTful API

Python 零基础100天—Day56 RESTful API

  • 2026-08-18 23:10:31
Python 零基础100天—Day56 RESTful API

RESTful API — 让你的应用会说话

🕐 预计用时:2-3 小时 | 🎯 目标:掌握 Blueprint 模块化、JSON API 设计规范和状态码


📖 今日目录

  1. 什么是 RESTful API?
  2. HTTP 状态码
  3. Blueprint 蓝图
  4. 第一个 API
  5. 完整 CRUD API
  6. API 设计规范
  7. 错误处理
  8. 分页
  9. 今日练习
  10. 今日小结

1. 什么是 RESTful API?

🌐 一句话解释

RESTful API 是前后端之间的"合同"——前端(网页/手机)用 HTTP 请求向后端要数据,后端返回 JSON 格式的数据。

# 前端:"给我所有用户"
GET /api/users
→ [{"id":1,"name":"alice"}, {"id":2,"name":"bob"}]

# 前端:"给我 id=1 的用户"
GET /api/users/1
→ {"id":1,"name":"alice","email":"alice@example.com"}

# 前端:"创建一个新用户"
POST /api/users  body: {"name":"charlie","email":"c@example.com"}
→ {"id":3,"name":"charlie"}  (201 Created)

# 前端:"删除 id=1 的用户"
DELETE /api/users/1
→ 204 No Content

🤝 REST 的核心原则

原则
含义
例子
资源导向
URL 代表资源(名词,不是动词)
/api/users
 ✅ | /api/getUsers ❌
HTTP 动词
用方法表示操作
GET 读 / POST 创建 / PUT 更新 / DELETE 删除
无状态
每次请求独立,不依赖之前的请求
不存 session,用 Token 认证
JSON 格式
请求和响应都用 JSON
{"name":"alice"}

📊 URL 设计对照表

操作
HTTP 方法
URL
状态码
获取所有用户
GET
/api/users
200
获取单个用户
GET
/api/users/1
200 / 404
创建用户
POST
/api/users
201
更新用户
PUT
/api/users/1
200 / 404
删除用户
DELETE
/api/users/1
204 / 404
搜索用户
GET
/api/users?q=alice
200

2. HTTP 状态码

状态码是后端给前端的"回执"——告诉前端请求的结果。

📋 常用状态码速查

状态码
含义
使用场景
200
OK
GET/PUT 成功
201
Created
POST 创建成功
204
No Content
DELETE 成功(无返回体)
400
Bad Request
请求参数有误
401
Unauthorized
未认证(未登录)
403
Forbidden
已认证但权限不足
404
Not Found
资源不存在
409
Conflict
资源冲突(如用户名已存在)
422
Unprocessable
数据格式正确但语义错误
500
Server Error
服务器内部错误

💡 状态码的记忆口诀:

• 2xx:成功(200 OK / 201 Created / 204 No Content)
• 4xx:客户端的错(400 参数错 / 401 没登录 / 403 没权限 / 404 不存在)
• 5xx:服务器的错(500 代码 bug / 502 网关错 / 503 服务不可用)


3. Blueprint 蓝图

🧩 为什么需要蓝图?

当应用变大时,所有路由写在一个文件里会变成几千行的"上帝文件"。蓝图让你把路由按功能拆分。

# 项目结构
myapp/
├── app.py
├── api/
│   ├── __init__.py
│   ├── users.py      ← 用户相关 API
│   └── posts.py      ← 文章相关 API
├── models.py
└── templates/

🔧 创建蓝图

# api/users.py
from flask import Blueprint, jsonify, request

# 创建蓝图:名称 'users',URL 前缀 /api/users
users_bp = Blueprint('users', __name__, url_prefix='/api/users')

@users_bp.route('/', methods=['GET'])
def get_users():
    return jsonify([{'id': 1, 'name': 'alice'}])

@users_bp.route('/<int:user_id>', methods=['GET'])
def get_user(user_id):
    return jsonify({'id': user_id, 'name': 'alice'})

@users_bp.route('/', methods=['POST'])
def create_user():
    data = request.get_json()
    return jsonify({'id': 3, 'name': data['name']}), 201

📌 注册蓝图

# app.py
from flask import Flask
from api.users import users_bp
from api.posts import posts_bp

app = Flask(__name__)

# 注册蓝图
app.register_blueprint(users_bp)
app.register_blueprint(posts_bp)

# 最终 URL:
# GET  /api/users/      → users_bp.get_users()
# GET  /api/users/1     → users_bp.get_user(1)
# GET  /api/posts/      → posts_bp.get_posts()

💡 蓝图 = 路由的"文件夹"

把相关路由放在同一个蓝图里,就像把文件分类放到不同文件夹。一个蓝图一个文件,改某个功能只动一个文件。

类比:蓝图 = 部门(销售部、技术部、财务部),每个部门有自己的职责和办公区域。


4. 第一个 API

🎯 最小 RESTful API

# app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

# 模拟数据库
users = [
    {'id': 1, 'name': 'alice', 'email': 'alice@example.com'},
    {'id': 2, 'name': 'bob', 'email': 'bob@example.com'},
]

# GET /api/users → 获取所有用户
@app.route('/api/users', methods=['GET'])
def get_users():
    return jsonify({
        'code': 200,
        'data': users,
        'total': len(users)
    })

# GET /api/users/<id> → 获取单个用户
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = next((u for u in users if u['id'] == user_id), None)
    if not user:
        return jsonify({'code': 404, 'message': '用户不存在'}), 404
    return jsonify({'code': 200, 'data': user})

# POST /api/users → 创建用户
@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()
    if not data or 'name' not in data:
        return jsonify({'code': 400, 'message': '缺少 name 字段'}), 400

    new_user = {
        'id': len(users) + 1,
        'name': data['name'],
        'email': data.get('email', '')
    }
    users.append(new_user)
    return jsonify({'code': 201, 'data': new_user}), 201

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

🧪 测试 API(用 curl)

# 获取所有用户
curl http://127.0.0.1:5000/api/users
# {"code":200,"data":[{"id":1,"name":"alice"},...],"total":2}

# 获取单个用户
curl http://127.0.0.1:5000/api/users/1
# {"code":200,"data":{"id":1,"name":"alice","email":"alice@example.com"}}

# 创建用户
curl -X POST http://127.0.0.1:5000/api/users \
     -H "Content-Type: application/json" \
     -d '{"name":"charlie","email":"c@example.com"}'
# {"code":201,"data":{"id":3,"name":"charlie","email":"c@example.com"}}

5. 完整 CRUD API

# api/users.py — 完整的用户 CRUD API
from flask import Blueprint, jsonify, request
from models import db, User

users_bp = Blueprint('users', __name__, url_prefix='/api/users')

# GET /api/users — 获取用户列表(支持分页和搜索)
@users_bp.route('/', methods=['GET'])
def get_users():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    keyword = request.args.get('q', '')

    query = User.query
    if keyword:
        query = query.filter(User.username.like(f'%{keyword}%'))

    pagination = query.paginate(page=page, per_page=per_page)

    return jsonify({
        'code': 200,
        'data': [{'id': u.id, 'name': u.username, 'email': u.email} for u in pagination.items],
        'total': pagination.total,
        'pages': pagination.pages,
        'current_page': page
    })

# GET /api/users/<id> — 获取单个用户
@users_bp.route('/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = User.query.get_or_404(user_id)
    return jsonify({
        'code': 200,
        'data': {'id': user.id, 'name': user.username, 'email': user.email}
    })

# POST /api/users — 创建用户
@users_bp.route('/', methods=['POST'])
def create_user():
    data = request.get_json()
    if not data:
        return jsonify({'code': 400, 'message': '请求体为空'}), 400

    if not data.get('username') or not data.get('email'):
        return jsonify({'code': 400, 'message': 'username 和 email 必填'}), 400

    if User.query.filter_by(username=data['username']).first():
        return jsonify({'code': 409, 'message': '用户名已存在'}), 409

    user = User(username=data['username'], email=data['email'])
    if data.get('password'):
        user.set_password(data['password'])
    db.session.add(user)
    db.session.commit()

    return jsonify({'code': 201, 'data': {'id': user.id, 'name': user.username}}), 201

# PUT /api/users/<id> — 更新用户
@users_bp.route('/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    user = User.query.get_or_404(user_id)
    data = request.get_json()

    if data.get('username'):
        user.username = data['username']
    if data.get('email'):
        user.email = data['email']

    db.session.commit()
    return jsonify({'code': 200, 'data': {'id': user.id, 'name': user.username}})

# DELETE /api/users/<id> — 删除用户
@users_bp.route('/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
    user = User.query.get_or_404(user_id)
    db.session.delete(user)
    db.session.commit()
    return '', 204

6. API 设计规范

📐 统一响应格式

# 推荐的统一响应格式
{
    "code": 200,           // 业务状态码
    "message": "success",  // 提示信息
    "data": { ... },       // 数据(成功时)
    "errors": [...]        // 错误详情(失败时)
}

# 成功示例
{"code": 200, "message": "success", "data": {"id": 1, "name": "alice"}}

# 错误示例
{"code": 400, "message": "参数错误", "errors": ["username 不能为空", "email 格式不对"]}

📋 API 设计 Checklist

规则
正确
错误
URL 用名词复数
/api/users/api/getUser
嵌套资源用路径
/api/users/1/posts/api/getUserPosts?uid=1
版本号在 URL 中
/api/v1/users/api/users?version=1
用 HTTP 方法表示操作
GET/POST/PUT/DELETE
GET /createUser
返回合适的 HTTP 状态码
201 Created
200 + {"status":"created"}
错误信息清晰可读
"用户名已存在"
"Error 409"

7. 错误处理

# 全局错误处理器
@app.errorhandler(404)
def not_found(error):
    return jsonify({'code': 404, 'message': '资源不存在'}), 404

@app.errorhandler(500)
def internal_error(error):
    return jsonify({'code': 500, 'message': '服务器内部错误'}), 500

@app.errorhandler(400)
def bad_request(error):
    return jsonify({'code': 400, 'message': '请求参数有误'}), 400

# abort 主动抛出错误
from flask import abort

@users_bp.route('/<int:user_id>')
def get_user(user_id):
    user = User.query.get(user_id)
    if not user:
        abort(404)  # 自动触发 404 处理器
    return jsonify(user.to_dict())

8. 分页

# 分页查询
@users_bp.route('/', methods=['GET'])
def get_users():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 20, type=int)

    # 限制每页数量
    per_page = min(per_page, 100)

    pagination = User.query.paginate(page=page, per_page=per_page)

    return jsonify({
        'data': [u.to_dict() for u in pagination.items],
        'pagination': {
            'page': pagination.page,
            'per_page': pagination.per_page,
            'total': pagination.total,
            'pages': pagination.pages,
            'has_next': pagination.has_next,
            'has_prev': pagination.has_prev,
        }
    })

9. 今日练习

🏋️ 练习 1:文章 CRUD API

# 实现文章的完整 CRUD:
# GET    /api/posts       → 获取文章列表(分页)
# GET    /api/posts/<id>  → 获取单篇文章
# POST   /api/posts       → 创建文章
# PUT    /api/posts/<id>  → 更新文章
# DELETE /api/posts/<id>  → 删除文章
# 要求:统一响应格式 + 合适的状态码

🏋️ 练习 2:嵌套资源

# 实现用户-文章的嵌套 API:
# GET /api/users/<id>/posts → 获取某用户的所有文章
# POST /api/users/<id>/posts → 给某用户创建文章
# 要求:检查用户是否存在(404)

🏋️ 练习 3:搜索与过滤

# 给文章 API 添加搜索和过滤:
# GET /api/posts?q=keyword      → 关键词搜索
# GET /api/posts?sort=created_at → 按时间排序
# GET /api/posts?sort=views      → 按浏览量排序
# GET /api/posts?order=desc      → 降序

10. 今日小结

知识点
核心内容
REST 概念
资源导向 + HTTP 动词 + JSON 格式 + 无状态
HTTP 状态码
2xx 成功 / 4xx 客户端错 / 5xx 服务器错
Blueprint
模块化路由,一个蓝图一个文件,register_blueprint 注册
CRUD API
GET 查询 / POST 创建 / PUT 更新 / DELETE 删除
响应格式
{ code, message, data } 统一格式
错误处理
errorhandler + abort + jsonify
分页
paginate(page, per_page) + 分页元数据

🚀 明日预告:Day 57 — Flask 进阶

API 写好了,但还需要更多"工程化"能力:中间件、错误处理、日志系统、CORS 跨域、配置管理。让你的 Flask 应用从"能跑"变成"能上线"!

轻松时刻:

请在微信客户端打开

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 21:39:43 HTTP/2.0 GET : https://f.mffb.com.cn/a/504613.html
  2. 运行时间 : 0.230229s [ 吞吐率:4.34req/s ] 内存消耗:4,736.06kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=bb559ed0460056c5c12652ae54ee7f1b
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001131s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001569s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000725s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000638s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001315s ]
  6. SELECT * FROM `set` [ RunTime:0.006969s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001489s ]
  8. SELECT * FROM `article` WHERE `id` = 504613 LIMIT 1 [ RunTime:0.012010s ]
  9. UPDATE `article` SET `lasttime` = 1787319583 WHERE `id` = 504613 [ RunTime:0.026536s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000687s ]
  11. SELECT * FROM `article` WHERE `id` < 504613 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001285s ]
  12. SELECT * FROM `article` WHERE `id` > 504613 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001521s ]
  13. SELECT * FROM `article` WHERE `id` < 504613 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002261s ]
  14. SELECT * FROM `article` WHERE `id` < 504613 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005830s ]
  15. SELECT * FROM `article` WHERE `id` < 504613 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002611s ]
0.233939s