【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 = '*'

       

 

      

 

 

 

 

      

 

posted @ 2020-09-13 23:38  tour8  阅读(234)  评论(0编辑  收藏  举报