Baby Buddy 常用 CLI 命令详解

Baby Buddy v2.11.0 命令行运维手册:manage.py 全量 46 个子命令分类速查,fake/drf_create_token/dumpdata/loaddata/axes_reset/pg_dump 备份恢复与 API 实战全部真机实测。

Baby BuddyBaby BuddyUbuntu22.04Python 编程2026/10/28

Baby Buddy 常用 CLI 命令详解

本文全部命令与回显来自 v2.11.0 真机实测。部署环境与进程托管见 《Baby Buddy 安装部署指南(Ubuntu 22.04 直装实录)》,参数含义见 《Baby Buddy 配置参数详解》。

一、运行身份与命令入口

manage.py 必须以应用属主执行。服务账户 shell 是 nologin,直接 su babybuddy -c 会被拒绝,统一用显式 shell 的写法(实测报错与正确姿势):

su babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py help"   # ✗

实测回显:

This account is currently not available.
su -s /bin/bash babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py help"   # ✓

为省事可在 /usr/local/bin/bb 放一个包装脚本:

#!/bin/bash
exec su -s /bin/bash babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py $*"

二、全量子命令分类速查

manage.py help 实测共 46 个子命令,按来源分类(v2.11.0 实测清单):

分类命令
Baby Buddy 自带(babybuddy/management/commands/)createuser、fake、reset、migrate(覆盖版)
axes 登录防护(django-axes 7.1)axes_list_attempts、axes_reset、axes_reset_failure_logs、axes_reset_ip、axes_reset_ip_username、axes_reset_logs、axes_reset_username
数据导入导出(django-import-export 4.4)export、import
API(DRF 3.18)drf_create_token、generateschema
Django 核心·数据dumpdata、loaddata、flush、dbshell、inspectdb、sqlflush、sqlmigrate、sqlsequencereset、squashmigrations、optimizemigration、remove_stale_contenttypes
Django 核心·迁移makemigrations、migrate、showmigrations
Django 核心·账户changepassword、createsuperuser
Django 核心·工程check、shell、diffsettings、runserver、test、testserver、startapp、startproject、findstatic、collectstatic
Django 核心·i18n/杂项compilemessages、makemessages、clearsessions、sendtestemail、createcachetable
图片(django-imagekit)generateimages

官方 gulp 里还有 collectstatic/migrate/fake 等「管道任务」,本质是 spawn pipenv run python manage.py ...,直装环境直接用 manage.py 即可。

三、Baby Buddy 自带命令实测

3.1 createuser——带分组的用户创建

比 createsuperuser 多了角色参数(--caregiver / --read-only,实查源码 add_arguments)。创建照护者账号:

bb createuser --username nurse1 --email nurse1@example.com --caregiver

实测回显(交互输入密码后):

User "nurse1" created successfully.

3.2 fake——一键生成演示数据

开发/演示利器:随机生成儿童、喂养、睡眠、换尿布、体重身高全套记录。

bb fake

实测回显:

Successfully added fake data.

生成量实测:2 个儿童(随机英文名)、161 条睡眠记录等。生产库慎用——没有参数撤销,只能 flush。

3.3 export——资源级 CSV 导出

基于 django-import-export,格式为 export <format> <resource>,resource 用 app.Model 全名(实测写 children 报 CommandError: Cannot import 'children' as a resource class or model.):

bb export csv core.Child

实测回显(直接打 stdout):

2,Emily,Nguyen,2026-09-27,,emily-nguyen,
1,Xiaoxin,Nohara,2025-06-01,,xiaoxin-nohara,

支持 format:csv/json/yaml/tsv 等 import_export 全集;import 命令与之对偶,用于回灌。

3.4 reset——危险命令

清空所有业务数据(保留用户与组),二次确认交互。等价于界面 Settings 里的 "Delete all data"。生产执行前先做第四节备份。

3.5 generateschema——导出 OpenAPI

bb generateschema > /tmp/schema.yml && wc -l /tmp/schema.yml

实测回显:

640 /tmp/schema.yml

导出 OpenAPI 3 文档可直接导入 Postman/Apifox,配合界面 /api/schema 在线版使用。

3.6 generateimages——媒体缩略图重建

系统升级或手动替换图片后重建缩略图缓存,无参数直接跑:

bb generateimages

实测回显(无图片媒体时):

0 images generated

四、登录防护与账号命令实测

4.1 锁定与解锁闭环(axes)

连续 5 次密码错误后(AXES_FAILURE_LIMIT=5),正确密码也被拒,HTTP 429。查看失败记录:

bb axes_list_attempts --username admin

实测回显(锁定中):

admin  | 172.16.11.1 | 2026-10-28 04:09:xx | username password

立即解锁:

bb axes_reset_username admin

实测回显:

1 attempts removed.

解锁后登录恢复正常(实测 login POST 302)。其余变体:axes_reset_ip <ip>(按 IP)、axes_reset(全量)、axes_reset_failure_logs --age 7(清理 7 天前失败日志)。

4.2 changepassword / createsuperuser

bb changepassword admin          # 交互式改密
bb createsuperuser --noinput --username admin2 --email a@e.com   # 密码经 DJANGO_SUPERUSER_PASSWORD 传入

重复创建同名用户实测报错:CommandError: Error: That username is already taken.

五、数据备份与恢复(双通道实测)

5.1 通道一:Django dumpdata / loaddata(跨数据库可移植)

bb dumpdata --natural-foreign --natural-primary \
  -e contenttypes -e auth.Permission -e authtoken -e admin.logentry -e axes \
  --indent 2 -o /opt/backups/babybuddy-export.json

实测回显:无输出即成功,文件 2.29 MB(含 9236 个对象)。

-e authtoken 排除 API token(敏感);恢复后 token 需重新签发(见 5.4)。

恢复演练——先清库再回灌:

bb flush --noinput
bb loaddata /opt/backups/babybuddy-export.json

实测回显:

Installed 9236 object(s) from 1 fixture(s)

数据完整性验证:

bb shell -c "from django.contrib.auth.models import User; from core.models import Child; print('users:', User.objects.count(), 'children:', Child.objects.count())"

实测回显:

users: 1 children: 2

5.2 通道二:pg_dump / psql(库级完整备份)

mkdir -p /var/backups/babybuddy && chown postgres:postgres /var/backups/babybuddy
su postgres -c "pg_dump babybuddy > /var/backups/babybuddy/babybuddy-pg.sql"
ls -la /var/backups/babybuddy/

实测回显:

-rw-rw-r-- 1 postgres postgres 598899 Oct 28 04:11 babybuddy-pg.sql

文件头自证:

--
-- PostgreSQL database dump
--

-- Dumped from database version 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1)
-- Dumped by pg_dump version 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1)

恢复(目标库需已存在或先 createdb):

su postgres -c "psql babybuddy < /var/backups/babybuddy/babybuddy-pg.sql"

5.3 双通道怎么选

场景选谁
每日定时备份(crontab)pg_dump(一致性好、含全部表结构与索引)
SQLite→PG 迁移 / 跨库搬家dumpdata(数据库无关)
只导业务数据给别的实例export csv / dumpdata + -e 排除

5.4 恢复后的三件事(实测清单)

  1. 重新签发 API token:bb drf_create_token admin(flush 会清掉 authtoken 表);
  2. 检查会话:bb clearsessions(过期会话表清理);
  3. systemctl restart babybuddy 后用浏览器登录验证仪表盘数据。

六、API Token 与 curl 实战

6.1 签发 token

bb drf_create_token admin

实测回显:

Generated token ddede6db18abb4a4224e3618763f8a727d5ce5aa for user admin

6.2 Token 调 API(无 Cookie、无 CSRF)

curl -s http://127.0.0.1:8147/api/children/ -H 'Authorization: Token ddede6db18abb4a4224e3618763f8a727d5ce5aa'

实测回显:

{"count":2,"next":null,"previous":null,"results":[{"id":2,"first_name":"Emily","last_name":"Nguyen","birth_date":"2026-09-27","birth_time":null,"slug":"emily-nguyen","picture":null},{"id":1,"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01","birth_time":null,"slug":"xiaoxin-nohara","picture":null}]}

带分页与过滤(limit=2 看睡眠记录,时间均为 UTC Z 结尾):

count: 161
2 2026-10-27T21:38:09.448202Z 2026-10-28T00:23:09.448202Z
2 2026-10-27T17:38:09.448202Z 2026-10-27T18:49:09.448202Z

6.3 写 API(创建儿童)

curl -s -X POST http://127.0.0.1:8147/api/children/ \
  -H "Authorization: Token <token>" -H "Content-Type: application/json" \
  -d '{"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01"}'

实测回显:

{"id":1,"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01","birth_time":null,"slug":"xiaoxin-nohara","picture":null}

slug 服务端自动生成(名-姓 小写化),后续引用儿童都靠它。资源清单见 API root:/api/ 返回 bmi/changes/children/feedings/height/sleep/tags/timers/weight 等 17 组端点。

七、例行维护命令

命令作用频率
bb clearsessions清过期会话cron 每天
bb collectstatic --noinput升级后重建静态每次升级
bb check配置健康检查升级后
bb showmigrations core | tail核对迁移进度升级后
pg_dump(5.2 节)库级备份cron 每天

collectstatic 实测回显(升级后重跑):

0 static files copied to '/opt/babybuddy/static', 183 unmodified, 446 post-processed.

sendtestemail(邮件链路自检,console 后端把邮件打到 stdout):

bb sendtestemail admin@example.com

实测回显(头几行):

Content-Type: text/plain; charset="utf-8"
Subject: Test email from babybuddy-server on 2026-10-28 04:10:16.822340+00:00
From: webmaster@localhost
To: admin@example.com

If you're reading this, it was successful.

八、cron 自动备份样例

# 每日 03:30 库级备份,保留 14 天
30 3 * * * postgres pg_dump babybuddy > /var/backups/babybuddy/babybuddy-$(date +\%F).sql
# 每日 04:00 清理会话
0 4 * * * babybuddy cd /opt/babybuddy/app && venv/bin/python manage.py clearsessions

媒体目录(儿童照片)单独 rsync:rsync -a /opt/babybuddy/app/media/ /var/backups/babybuddy/media/。