【严正声明】:本文章内含有Ai生成内容,如有侵权,请联系站长QQ邮箱:3464972090@qq.com进行删除(请提供版权证明)本站原创文章未经授权请勿用于任何商业用途
今天为大家带来基于Python3.10+Flask的轻量级签到服务开发全解析:
一、技术选型与架构设计
本方案采用经典的三层架构模式,核心技术栈:
- 核心框架:Flask 2.3(轻量级WSGI框架)
- 数据存储:SQLite3(开发环境)/ PostgreSQL(生产环境)
- 认证体系:JWT + SHA256加密
- 辅助工具:Peewee ORM、Pendulum时间库
# 环境依赖 pip install flask peewee pendulum pyjwt
二、数据库建模(Peewee实现)
from peewee import * db = SqliteDatabase('attendance.db') class BaseModel(Model): class Meta: database = db class User(BaseModel): username = CharField(unique=True) hashed_pw = CharField() salt = CharField() department = CharField() class AttendanceRecord(BaseModel): user = ForeignKeyField(User, backref='records') sign_type = CharField(choices=['checkin', 'checkout']) timestamp = DateTimeField() geo_location = CharField(null=True) device_fingerprint = CharField()
三、核心签到逻辑实现
1. 签到服务类
from pendulum import now, timezone import hashlib class AttendanceService: @classmethod def generate_device_id(cls, request): """生成设备指纹""" return hashlib.sha256( f"{request.user_agent}{request.remote_addr}".encode() ).hexdigest() @classmethod def validate_sign_window(cls, last_sign): """验证签到时间窗口""" current = now('Asia/Shanghai') return current.diff(last_sign).in_minutes() > 15
2. 签到路由控制
from flask import request import jwt @app.route('/api/v1/sign', methods=['POST']) @jwt_required() def handle_sign(): try: current_user = get_jwt_identity() device_id = AttendanceService.generate_device_id(request) with db.atomic(): last_record = AttendanceRecord.select().where( (AttendanceRecord.user == current_user['id']) & (AttendanceRecord.sign_type == request.json['type']) ).order_by(AttendanceRecord.timestamp.desc()).first() if last_record and not AttendanceService.validate_sign_window(last_record.timestamp): return jsonify({'error': '操作过于频繁'}), 429 AttendanceRecord.create( user=current_user['id'], sign_type=request.json['type'], timestamp=now('Asia/Shanghai'), geo_location=request.json.get('geo'), device_fingerprint=device_id ) return jsonify({'message': '操作成功'}), 201
四、高级功能实现
1. 防作弊策略
def validate_signature_consistency(request): """验证请求特征一致性""" current_device = AttendanceService.generate_device_id(request) stored_device = get_current_user().last_device_id mismatch_count = 0 if current_device != stored_device: mismatch_count += 1 if mismatch_count > 3: trigger_security_alert()
2. 数据统计端点
@app.route('/api/v1/stats/monthly') @role_required('HR') def monthly_stats(): query = (AttendanceRecord .select( fn.strftime('%Y-%m-%d', AttendanceRecord.timestamp).alias('date'), fn.COUNT(AttendanceRecord.id).alias('total') ) .group_by(fn.strftime('%Y-%m-%d', AttendanceRecord.timestamp)) return jsonify({ 'data': [{'date': item.date, 'count': item.total} for item in query] })
五、生产环境部署建议
- 使用Gunicorn+Gevent部署WSGI服务
- 配置Nginx反向代理
- 启用Redis缓存高频查询
- 添加Prometheus监控端点
- 实现数据库每日自动备份
六、性能优化方案
- 查询优化:为timestamp字段添加索引
- 缓存策略:对统计数据进行Redis缓存
- 批量写入:使用Peewee的bulk_create方法
- 连接池:配置PostgreSQL连接池
结语
建议开发者们根据实际需求扩展以下功能:
- 人脸识别签到模块
- 微信小程序集成
- 考勤异常自动通知
- 数据可视化大屏
版权所有:小岩的个人技术分享
文章标题:🔖【技术分享】基于Python的企业级签到系统开发手记 | 从零搭建签到服务
文章链接:http://xiaoyanboke.cn/?post=56
本站文章内含有Ai生成内容,如有侵权,请联系站长QQ邮箱:3464972090@qq.com进行删除(请提供版权证明)本站原创文章未经授权请勿用于任何商业用途
文章标题:🔖【技术分享】基于Python的企业级签到系统开发手记 | 从零搭建签到服务
文章链接:http://xiaoyanboke.cn/?post=56
本站文章内含有Ai生成内容,如有侵权,请联系站长QQ邮箱:3464972090@qq.com进行删除(请提供版权证明)本站原创文章未经授权请勿用于任何商业用途