zoukankan      html  css  js  c++  java
  • Server-side Sessions with Redis | Flask (A Python Microframework)

    Server-side Sessions with Redis | Flask (A Python Microframework)

    Server-side Sessions with Redis

    By Armin Ronacher filed in Sessions

    If you need to store a lot of session data it makes sense to move the data from the cookie to the server. In that case you might want to use redis as the storage backend for the actual session data.

    The following code implements a session backend using redis. It allows you to either pass in a redis client or will connect to the redis instance on localhost. All the keys are prefixed with a specified prefix which defaults to session:.

    import pickle
    from datetime import timedelta
    from uuid import uuid4
    from redis import Redis
    from werkzeug.datastructures import CallbackDict
    from flask.sessions import SessionInterface, SessionMixin
    
    
    class RedisSession(CallbackDict, SessionMixin):
    
        def __init__(self, initial=None, sid=None, new=False):
            def on_update(self):
                self.modified = True
            CallbackDict.__init__(self, initial, on_update)
            self.sid = sid
            self.new = new
            self.modified = False
    
    
    class RedisSessionInterface(SessionInterface):
        serializer = pickle
        session_class = RedisSession
    
        def __init__(self, redis=None, prefix='session:'):
            if redis is None:
                redis = Redis()
            self.redis = redis
            self.prefix = prefix
    
        def generate_sid(self):
            return str(uuid4())
    
        def get_redis_expiration_time(self, app, session):
            if session.permanent:
                return app.permanent_session_lifetime
            return timedelta(days=1)
    
        def open_session(self, app, request):
            sid = request.cookies.get(app.session_cookie_name)
            if not sid:
                sid = self.generate_sid()
                return self.session_class(sid=sid, new=True)
            val = self.redis.get(self.prefix + sid)
            if val is not None:
                data = self.serializer.loads(val)
                return self.session_class(data, sid=sid)
            return self.session_class(sid=sid, new=True)
    
        def save_session(self, app, session, response):
            domain = self.get_cookie_domain(app)
            if not session:
                self.redis.delete(self.prefix + session.sid)
                if session.modified:
                    response.delete_cookie(app.session_cookie_name,
                                           domain=domain)
                return
            redis_exp = self.get_redis_expiration_time(app, session)
            cookie_exp = self.get_expiration_time(app, session)
            val = self.serializer.dumps(dict(session))
            self.redis.setex(self.prefix + session.sid, val,
                             int(redis_exp.total_seconds()))
            response.set_cookie(app.session_cookie_name, session.sid,
                                expires=cookie_exp, httponly=True,
                                domain=domain)
    

    Here is how to enable it:

    app = Flask(__name__)
    app.session_interface = RedisSessionInterface()
    

    If you get an attribute error that total_seconds is missing it means you're using a version of Python older than 2.7. In this case you can use this function as a replacement for the total_seconds method:

    def total_seconds(td):
        return td.days * 60 * 60 * 24 + td.seconds
    

    This snippet by Armin Ronacher can be used freely for anything you like. Consider it public domain.

     
  • 相关阅读:
    100%解决XP系统asp http500内部错误[转自XX博客]
    .net使用DotNetCharting控件生成报表统计图总结 (转地址)
    关于request取中文字符串变?的解决办法
    Delete删除大批量数据无响应的解决办法
    点击GridView模版列里的按钮取GridView当前被操作行的数据(转载)
    繁體字顯示問題
    寫博客過程中遇到的問題
    box model相關的API
    Buddhism常用術語
    靡不有初鮮克有終
  • 原文地址:https://www.cnblogs.com/lexus/p/3463520.html
Copyright © 2011-2022 走看看