国家住房建设部网站,企业官网 开源,吴江区经济开发区规建设局网站,如何做网站本地服务器吗这里写目录标题一、权限的数据的特点二、首先settings.py文件中配置redis连接redis数据库一、权限的数据的特点
需要去数据库中频繁的读和写#xff0c;为了项目提高运行效率#xff0c;可以把用户的权限在每次登录的时候都缓存到redis中。这样的话#xff0c;权限判断的中…
这里写目录标题一、权限的数据的特点二、首先settings.py文件中配置redis连接redis数据库一、权限的数据的特点
需要去数据库中频繁的读和写为了项目提高运行效率可以把用户的权限在每次登录的时候都缓存到redis中。这样的话权限判断的中间件就可以方便的从redis中得到当前用户的所有权限从而判断。 对于那些数据量大并且需要频繁的读写一定需要做缓存的
在默认的app中定义utils包创建cache_permissions.py
二、首先settings.py文件中配置redis
# 配置Redis数据库
CACHES {default: { # 默认BACKEND: django_redis.cache.RedisCache,#LOCATION: redis://82.156.178.247:6379/0,LOCATION: redis://127.0.0.1:6379/0,OPTIONS: {CLIENT_CLASS: django_redis.client.DefaultClient,}},session: { # sessionBACKEND: django_redis.cache.RedisCache,# LOCATION: redis://82.156.178.247:6379/1,LOCATION: redis://127.0.0.1:6379/1,OPTIONS: {CLIENT_CLASS: django_redis.client.DefaultClient,}},verify_code: { # 验证码BACKEND: django_redis.cache.RedisCache,# LOCATION: redis://82.156.178.247:6379/2,LOCATION: redis://127.0.0.1:6379/2,OPTIONS: {CLIENT_CLASS: django_redis.client.DefaultClient,}},
}
SESSION_ENGINE django.contrib.sessions.backends.cache
SESSION_CACHE_ALIAS session连接redis数据库
首先安装django-redis pip install django-reids 获得redis数据库的连接 from django_redis import get_redis_connection redis_connget_redis_connection(“default”) 以哈希的方式存储数据到redis中 redis_conn.hmset(f’user.id’,permissions_dict) 把当前用户的权限信息缓存到redis数据库中 redis中存放用户权限的结构为user_用户id——字典{key:path,value[列表]}——》json字符串
from erp_system.models import MenuModel,PermissionsModel
import json
from django_redis import get_redis_connectiondef redis_storage_permissions(user):把当前用户的权限信息缓存到redis数据库中redis中存放用户权限的结构为user_用户id——字典{key:path,value[列表]}——》json字符串#查询当前登录用户拥有的权限id列表values_list: 返回列表中套元组values返回列表中套字典permission_ids user.roles.values_list(permissions, flatTrue).distinct()#根据权限id获取权限的所有值一级菜单的权限除外permissionsPermissionsModel.objects.filter(is_menuFalse,id__inpermission_ids).values(id,path,method,name)#permissions是查询集嵌套字典的列表if not permissions.exists(): #没有查询到权限returnpermissions_dict{} #todo 存放当前用户的权限,path为keyfor permission in permissions:#因为数据需要转换成json格式的字符串所以排除那些特殊符号#\u200b是Unicode中的零度字符可以理解为不可见字符例如回车、换行符、制表符methodstr(permission.get(method)).replace(\u200b,)pathstr(permission.get(path)).replace(\u200b,)_namestr(permission.get(name)).replace(\u200b,)_idpermission.get(id)if path in permissions_dict:permissions_dict[path].append({ #todo 一个请求路径有很多的权限增删改查只是method不同method:method,sign:_name,id:_id})else:permissions_dict[path][{ #如果没有path添加进去method: method,sign: _name,id: _id}]for key in permissions_dict:permissions_dict[key]json.dumps(permissions_dict[key])print(permissions_dict)#todo 存放到redis中redis_connget_redis_connection(default) #todo 获得redis数据库的连接redis_conn.hmset(fuser_{user.id},permissions_dict) # todo 以哈希的方式存放数据到redis用户认证通过后自动调用redis_storage_permissions(user)方法
from django.contrib.auth.backends import ModelBackend
from .models import UserModel
import logging
from erp_project.utils.cache_permissions import redis_storage_permissionslogger logging.getLogger(erp)class UserLoginAuth(ModelBackend):def authenticate(self, request, usernameNone, passwordNone, **kwargs):实现用户认证try:user UserModel.objects.get(usernameusername)logger.info(user)except:return None#判断密码if user.check_password(password):redis_storage_permissions(user) #todo 调用缓存数据的方法return user # 把user对象放到request对象中登录操作后查看缓存中的数据