【严正声明】:本文章内含有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进行删除(请提供版权证明)本站原创文章未经授权请勿用于任何商业用途