【django】连接redis&pickle模块&跨域问题
1、连接redis
- settings.py文件增加配置
1 CACHES = { 2 "default": { 3 "BACKEND": "django_redis.cache.RedisCache", 4 "LOCATION": "redis://127.0.0.1:6379/1", 5 "OPTIONS": { 6 "CLIENT_CLASS": "django_redis.client.DefaultClient", 7 "CONNECTION_POOL_KWARGS": {"max_connections": 100}, 8 "PASSWORD": "", # 密码 9 # 这个redis是返回数据是bytes类型的,登录的时候user用pickle序列化的,存的是二进制,取出来的也是二进制 10 } 11 }, 12 "redis2": { 13 "BACKEND": "django_redis.cache.RedisCache", 14 "LOCATION": "redis://xxx.xxx.xxx.xxx:6379/2", 15 "OPTIONS": { 16 "CLIENT_CLASS": "django_redis.client.DefaultClient", 17 "CONNECTION_POOL_KWARGS": {"max_connections": 100, 'decode_responses': True}, 18 # 这个redis配置,从redis里面取到数据后会自动转成字符串,不是bytes类型 19 "PASSWORD": "", # 密码 20 } 21 22 } 23 }
- 登录成功写入redis
1 #获取redis链接 默认取配置文件中的default 2 redis = django_redis.get_redis_connection() 3 # key value 过期时间 4 redis.set(const.SESSION+token,pickle.dumps(user),const.EXIT_TIME)
- 注销删除key
1 # 获取链接 2 redis = django_redis.get_redis_connection() 3 #删除key 4 redis.delete(const.SESSION+request.token)
- 中间件处理请求,获取token
- settings.py增加配置
- myMiddlewares.py检查各接口是否带有token
-
# 不需要登录的接口列表 NO_LOGIN_LIST = ['login','register']
1 class SessionMidddleware(MiddlewareMixin): 2 # 增加 一个过滤的场景 3 # 预置一个列表,用于存储,哪些接口可以不登录可直接访问 4 def check_url(self,path_info): 5 for url in NO_LOGIN_LIST: 6 # path_info前端过来的路径 /api/login 7 # url NO_LOGIN_LIST login 8 if url in path_info: 9 # 当前访问接口路径在列表里,则返回False表示不用登录 10 return False 11 return True 12 13 def process_request(self,request): 14 '''请求过来之后都走到这里''' 15 # print('dir(request):',dir(request)) 16 # # 前端传递过来的token 会自动变成大写,并且在前面增加HTTP 17 18 print('request.path_info',request.path_info) 19 if self.check_url(request.path_info): 20 token = request.META.get('HTTP_TOKEN') 21 print("request.META.get('HTTP_TOKEN'):",request.META.get('HTTP_TOKEN')) 22 if token: 23 redis = django_redis.get_redis_connection() 24 b_data = redis.get(const.SESSION+token) 25 print('b_data:', b_data) 26 if b_data: 27 data = pickle.loads(b_data) 28 # 将当前的登录信息 存储在request中 29 request.user = data 30 request.user_id = data.id 31 request.token = token 32 else: 33 return NbResponse(-1,'请登录') 34 else: 35 return NbResponse(-1, '请登录')
- 安装:pip3 install django-redis
2、跨域问题,CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
- 资料参考:http://www.ruanyifeng.com/blog/2016/04/cors.html
- 解决
- 安装:pip3 install django-cors-headers
- settings.py文件配置
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders', # 解决跨域问题 'user', # 添加创建的子应用, 'example' ] #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware',#csrf校验 'corsheaders.middleware.CorsMiddleware', # 允许跨域的中间件,需要安装 ] CORS_ORIGIN_ALLOW_ALL = True # 加上这个允许所有跨域 CORS_ALLOW_HEADERS = '*'