class UserSigninLog(db.Model): """登录日志表""" bind_key = 'db2' tablename = 'user_signin_log' id = mapped_column(Integer, primary_key=True) userid = mapped_column(String(16), index=True) username = mapped_column(String(32)) ip_addr = mapped_column(String(32)) request_user_agent = mapped_column(String(256)) c_date = mapped_column(DateTime) @staticmethod def add_user_signin_log(userid: str, username: str): """新增登录日志""" user_signin_log = UserSigninLog() user_signin_log.userid = userid user_signin_log.username = username user_signin_log.ip_addr = request.access_route[0] user_signin_log.request_user_agent = request.headers.get("User-Agent") user_signin_log.c_date = datetime.now() db.session.add(user_signin_log) db.session.commit() return True @staticmethod def check_ip_and_header_within_x_days(userid: str, days=7): """检查x天内登录过的ip地址和请求头""" sql_query = select(UserSigninLog) \ .where(UserSigninLog.userid == userid, UserSigninLog.ip_addr == request.access_route[0], UserSigninLog.request_user_agent == request.headers.get("User-Agent"), UserSigninLog.c_date >= datetime.now() - timedelta(days=days)).limit(1) user_ip_addr_log = db.session.execute(sql_query).scalar_one_or_none() if user_ip_addr_log: return True return False 请帮我优化并建议
时间: 2024-02-17 22:00:02 浏览: 24
这段代码中的add_user_signin_log和check_ip_and_header_within_x_days方法都是静态方法,这意味着它们不依赖于类的实例,因此可以将它们提取到一个单独的辅助类中,以便更好地组织代码。同时,建议将数据库访问逻辑从模型类中分离出来,以便更好地实现单一职责原则。
下面是优化后的代码:
```
class UserSigninLog(db.Model):
"""登录日志表"""
__bind_key__ = 'db2'
__tablename__ = 'user_signin_log'
id = db.Column(db.Integer, primary_key=True)
userid = db.Column(db.String(16), index=True)
username = db.Column(db.String(32))
ip_addr = db.Column(db.String(32))
request_user_agent = db.Column(db.String(256))
c_date = db.Column(db.DateTime)
class UserSigninLogService:
@staticmethod
def add_user_signin_log(userid: str, username: str, ip_addr: str, user_agent: str):
"""新增登录日志"""
user_signin_log = UserSigninLog()
user_signin_log.userid = userid
user_signin_log.username = username
user_signin_log.ip_addr = ip_addr
user_signin_log.request_user_agent = user_agent
user_signin_log.c_date = datetime.now()
db.session.add(user_signin_log)
db.session.commit()
@staticmethod
def check_ip_and_header_within_x_days(userid: str, ip_addr: str, user_agent: str, days=7):
"""检查x天内登录过的ip地址和请求头"""
user_ip_addr_log = UserSigninLog.query.filter_by(userid=userid, ip_addr=ip_addr, request_user_agent=user_agent).\
filter(UserSigninLog.c_date >= datetime.now() - timedelta(days=days)).first()
return user_ip_addr_log is not None
```
在优化后的代码中,将add_user_signin_log和check_ip_and_header_within_x_days方法提取到了UserSigninLogService类中。同时,将数据库访问逻辑从模型类中分离出来,使用query对象进行查询。在check_ip_and_header_within_x_days方法中使用了first方法而不是scalar_one_or_none方法,它们的效果是相同的,但是前者更加常用和易读。
建议对ip_addr和user_agent参数进行参数校验,确保它们的值是合法的。