class UserCache(UserMixin): """用户表缓存""" userid: str username: str alternative_id: str homepage: str permissions: list def get_id(self): """使用替代用户ID,当账号信息发生变化时,替代ID更改为新的随机生成的值,确保他们的旧身份验证会话不再有效。""" return self.alternative_id @staticmethod def add_user_cache(alternative_id: str, **kwargs): """添加user缓存""" user_key = f"{PROJECT_NAME}-{alternative_id}" values = {"alternative_id": alternative_id} values.update(kwargs) redis_client.hmset(user_key, values) redis_client.expire(user_key, SIGNIN_LIFETIME) return True @staticmethod def del_user_cache(alternative_id: str): """删除user缓存""" redis_client.delete(f"{PROJECT_NAME}-{alternative_id}") return True @staticmethod def get_user_cache(alternative_id) -> object: """获取user缓存""" user_cache_dict = redis_client.hgetall(f"{PROJECT_NAME}-{alternative_id}") if user_cache_dict: user_cache = UserCache() user_cache.userid = user_cache_dict.get('userid') user_cache.username = user_cache_dict.get('username') user_cache.alternative_id = user_cache_dict.get('alternative_id') user_cache.homepage = user_cache_dict.get('homepage') user_cache.permissions = user_cache_dict.get('permissions').split(",") # redis里存的是字符串,转为列表 return user_cache 帮我检查和优化代码,包括命名是否优雅
时间: 2024-01-31 16:04:23 浏览: 181
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
5星 · 资源好评率100%
以下是对代码的检查和优化建议:
1. 类名 `UserCache` 可能不太恰当,因为它并不是缓存类,而是一个用户类,可以考虑将其重命名为 `User`。
2. 类属性的命名建议使用下划线分隔的小写字母单词,例如 `alternative_id` 可以改为 `alternative_id`。
3. `get_id` 方法可以直接返回 `alternative_id` 属性,不必声明一个方法。
4. `add_user_cache` 和 `del_user_cache` 方法可以改为实例方法,而不是静态方法。这样更符合面向对象的编程习惯。
5. `get_user_cache` 方法可以使用字典解析式来简化代码:
```python
@classmethod
def get_user_cache(cls, alternative_id):
"""获取用户缓存"""
user_cache_dict = redis_client.hgetall(f"{PROJECT_NAME}-{alternative_id}")
if user_cache_dict:
user_cache_dict['permissions'] = user_cache_dict['permissions'].split(",")
return cls(**user_cache_dict)
```
这里使用了类方法,因为该方法需要返回一个 `User` 实例。
6. 如果要使用 `User` 类来代替 Flask-Login 提供的默认用户类,可以让 `User` 类继承 `Flask-Login` 提供的 `UserMixin` 类。
7. 为了防止 Redis 中的键名与其他应用程序冲突,可以在键名前添加一个前缀,例如 `"{PROJECT_NAME}-user-{alternative_id}"`。
8. 为了增强代码的可维护性和可读性,可以为 Redis 客户端和键名添加公共前缀,例如:
```python
class User(UserMixin):
REDIS_PREFIX = f"{PROJECT_NAME}-user"
def __init__(self, alternative_id, userid=None, username=None, homepage=None, permissions=None):
self.alternative_id = alternative_id
self.userid = userid
self.username = username
self.homepage = homepage
self.permissions = permissions or []
def get_id(self):
return self.alternative_id
def add_to_cache(self):
values = {
"alternative_id": self.alternative_id,
"userid": self.userid,
"username": self.username,
"homepage": self.homepage,
"permissions": ",".join(self.permissions),
}
redis_key = f"{self.REDIS_PREFIX}:{self.alternative_id}"
redis_client.hmset(redis_key, values)
redis_client.expire(redis_key, SIGNIN_LIFETIME)
def delete_from_cache(self):
redis_client.delete(f"{self.REDIS_PREFIX}:{self.alternative_id}")
@classmethod
def load_from_cache(cls, alternative_id):
redis_key = f"{cls.REDIS_PREFIX}:{alternative_id}"
user_cache_dict = redis_client.hgetall(redis_key)
if user_cache_dict:
user_cache_dict['permissions'] = user_cache_dict.get('permissions', '').split(",")
return cls(**user_cache_dict)
```
这样可以使代码更加清晰,也可以方便地更改 Redis 前缀。
阅读全文