import datetime
from flask import Blueprint, jsonify, request
import redis
from flask import jsonify, current_app
class Redis(object):
"""
redis数据库操作
"""
@staticmethod
def _get_r():
# 获得连接
host = "127.0.0.1"
port = "6379"
db = "0"
password = "123456"
r = redis.StrictRedis(host, port, db, decode_responses=True, password=password)
return r
@classmethod
def exists(cls, key):
r = cls._get_r()
"""
存在返回1,
不存在返回0
"""
return r.exists(key)
@classmethod
def write(cls, key, value, expire=None):
"""
写入键值对
"""
# 判断是否有过期时间,没有就设置默认值
if expire:
expire_in_seconds = expire
else:
expire_in_seconds = eval(current_app.config['REDIS_EXPIRE'])
r = cls._get_r()
try:
r.set(key, value, ex=expire_in_seconds)
return True
except redis.ConnectionError:
return False
@classmethod
def read(cls, key):
"""
读取键值对内容
"""
r = cls._get_r()
value = r.get(key)
return value
@classmethod
def rewrite(cls, key,offset, value):
"""
Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
0 重写String
"""
r = cls._get_r()
return r.setrange(key, offset, value)
@classmethod
def hset(cls, name, key, value):
"""
写入hash表
"""
r = cls._get_r()
r.hset(name, key, value)
@classmethod
def hmset(cls, key, *value):
"""
读取指定hash表的所有给定字段的值
"""
r = cls._get_r()
value = r.hmset(key, *value)
return value
@classmethod
def hget(cls, name, key):
"""
读取指定hash表的键值
"""
r = cls._get_r()
value = r.hget(name, key)
return value.decode('utf-8') if value else value
@classmethod
def hgetall(cls, name):
"""
获取指定hash表所有的值
"""
r = cls._get_r()
return r.hgetall(name)
@classmethod
def delete(cls, *names):
"""
删除一个或者多个
"""
r = cls._get_r()
r.delete(*names)
@classmethod
def hdel(cls, name, key):
"""
删除指定hash表的键值
"""
r = cls._get_r()
r.hdel(name, key)
@classmethod
def expire(cls, name, expire=None):
"""
设置过期时间
"""
if expire:
expire_in_seconds = expire
else:
expire_in_seconds = current_app.config['REDIS_EXPIRE']
r = cls._get_r()
r.expire(name, expire_in_seconds)
@classmethod
def sadd(cls, name, key):
"""
set list
"""
r = cls._get_r()
r.sadd(name, key)
@classmethod
def getKeys(cls, key):
r = cls._get_r()
return r.keys(key)
# 请求拦截器,对未登录的链接进行拦截,防止非法访问
@app.before_request
def before_user():
# 获取在线ip统计在线人数
try:
real_ip = request.headers['X-Forwarded-For']
if len(real_ip.split(',')) > 1:
real_ip = real_ip.split(",")[1]
except KeyError:
real_ip = ''
current_app.logger.info('real_ip=' + real_ip)
cur_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 当key网段不存在,写入到redis
Redis.write("ONLINE_USER:" + real_ip[0:10], cur_time, 60 * 2)
online_user_cnt = len(Redis.getKeys("ONLINE_USER*"))
current_app.logger.info('online user=' + str(online_user_cnt))
1.统计redis中key的数量
2.Nginx 反向代理 + Flask + gunicorn 架构解决获取用户真实ip问题
版权声明:本文为qq_27694835原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。