环境准备
零门槛部署需提前完成2项基础操作,每步都有验证机制:
- 访问Python官方下载页,下载对应系统的Python3.10+版本,安装时必须勾选Add Python to PATH选项;安装完成后打开终端/命令行,输入
python --version,显示版本号即验证成功
- 安装项目依赖,国内网络执行命令:pip install flask sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple,国外网络可去掉镜像源参数
核心功能实现
1. 项目结构创建
在任意本地路径新建文件夹命名为user_retention,文件夹内新建1个空文件app.py,所有代码将写入该文件,无需创建其他目录。
2. 完整代码编写
打开app.py,将以下代码完整复制粘贴,无需修改即可运行:
```python
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime, timedelta
初始化Flask应用
app = Flask(__name__)
核心配置:SQLite数据库路径,自动生成在user_retention文件夹内的retention.db
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./retention.db'
关闭修改追踪,减少资源占用
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
初始化数据库
db = SQLAlchemy(app)
用户数据模型,存储注册、最后登录时间
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
register_time = db.Column(db.DateTime, nullable=False)
last_login_time = db.Column(db.DateTime, nullable=False)
转成字典格式,方便接口返回数据
def to_dict(self):
return {
'user_id': self.id,
'register_time': self.register_time.strftime('%Y-%m-%d %H:%M:%S'),
'last_login_time': self.last_login_time.strftime('%Y-%m-%d %H:%M:%S')
}
创建数据库表,必须在应用上下文内执行
with app.app_context():
db.create_all()
注册接口:接收用户名,生成新用户
@app.route('/api/register', methods=['POST'])
def register():
data = request.get_json()
username = data.get('username')
if not username:
return jsonify({'code':400, 'msg':'用户名不能为空'}), 400
注册时间和首次登录时间为当前时间
new_user = User(
register_time=datetime.now(),
last_login_time=datetime.now()
)
db.session.add(new_user)
db.session.commit()
return jsonify({'code':200, 'msg':'注册成功', 'user':new_user.to_dict()})
登录接口:接收用户ID,更新最后登录时间
@app.route('/api/login', methods=['POST'])
def login():
data = request.get_json()
user_id = data.get('user_id')
user = User.query.get(user_id)
if not user:
return jsonify({'code':404, 'msg':'用户不存在'}), 404
更新最后登录时间为当前时间
user.last_login_time = datetime.now()
db.session.commit()
return jsonify({'code':200, 'msg':'登录成功', 'user':user.to_dict()})
7日留存统计接口:返回注册满7天用户的留存率
@app.route('/api/retention/7day', methods=['GET'])
def retention_7day():
now = datetime.now()
seven_days_ago = now - timedelta(days=7)
总注册用户:注册时间早于7天前的用户
total = User.query.filter(User.register_time <= seven_days_ago).count()
7日留存用户:注册满7天,且最后登录时间在7天内的用户
retained = User.query.filter(
User.register_time <= seven_days_ago,
User.last_login_time >= seven_days_ago
).count()
计算留存率,避免除以0异常
rate = round(retained / total 100, 2) if total > 0 else 0
return jsonify({
'code':200,
'total_register_7day_before':total,
'retained_7day':retained,
'retention_rate_7day':f'{rate}%'
})
启动应用
if __name__ == '__main__':
app.run(debug=True)
```
本地测试流程
1. 启动服务

打开终端,进入user_retention文件夹,执行命令:python app.py,终端显示Running on http://127.0.0.1:5000即服务启动成功,端口固定为5000,无需额外配置。
2. 接口测试方法
打开新终端,按以下步骤执行,无需安装额外工具:
- 注册用户:执行命令(直接复制)curl -X POST -H "Content-Type: application/json" -d '{"username":"test_user_1"}' http://127.0.0.1:5000/api/register,结果中会得到用户ID(示例为
{"user_id":1,...})
- 模拟登录(活跃):执行命令,将上面得到的用户ID替换为1:curl -X POST -H "Content-Type: application/json" -d '{"user_id":1}' http://127.0.0.1:5000/api/login
- 查看7日留存:执行命令curl http://127.0.0.1:5000/api/retention/7day,返回的
retention_rate_7day就是当前留存率数值
留存优化实操技巧
1. 数据解读规则
仅需关注2个固定值:注册满7天的总用户数和7天内活跃的用户数,留存率=(活跃用户数/总用户数)×100%,无需计算其他冗余指标。
2. 可落地的优化动作
- 若7日留存率低于30%:新增注册后24小时内的个性化引导,修改注册接口,返回
{"need_guide":true}标识,前端收到后弹出首任务引导弹窗,无需开发复杂功能
- 若留存率在30%-50%之间:针对最后登录时间超过2天的用户,发送带专属福利的通知,修改登录接口,若最后登录时间超过2天,返回
{"need_push":true}标识,前端触发推送逻辑
- 数据库清理:每月执行一次,删除注册时间早于30天且未登录的冗余数据,执行命令:python -c "from app import app, db, User; with app.app_context(): User.query.filter(User.register_time < datetime.now()-timedelta(days=30), User.last_login_time == None).delete(); db.session.commit()"