zoukankan      html  css  js  c++  java
  • Python中的__get__与__set__

    1、__get__的用法

      参见:https://www.cnblogs.com/saolv/p/6890645.html

    2、Flask中的使用

    2.1、Flask中源码

      Flask类:

      内置的配置值定义参见:http://www.pythondoc.com/flask/config.html

    class Flask(_PackageBoundObject):
    	testing = ConfigAttribute('TESTING')
    	secret_key = ConfigAttribute('SECRET_KEY')
    	session_cookie_name = ConfigAttribute('SESSION_COOKIE_NAME')
    	permanent_session_lifetime = ConfigAttribute('PERMANENT_SESSION_LIFETIME',
            get_converter=_make_timedelta)
    	send_file_max_age_default = ConfigAttribute('SEND_FILE_MAX_AGE_DEFAULT',
            get_converter=_make_timedelta)
    	use_x_sendfile = ConfigAttribute('USE_X_SENDFILE')
    	env = ConfigAttribute('ENV')
    

      ConfigAttribute类:

    class ConfigAttribute(object):
        """Makes an attribute forward to the config"""
    
        def __init__(self, name, get_converter=None):
            self.__name__ = name
            self.get_converter = get_converter
    
        def __get__(self, obj, type=None):
            print("__get__() is called", obj, type)
            if obj is None:
                return self
            rv = obj.config[self.__name__]
            if self.get_converter is not None:
                rv = self.get_converter(rv)
            return rv
    
        def __set__(self, obj, value):
            print("__set__() is called", obj, value)
            obj.config[self.__name__] = value
    

    2.2、测试用Flask程序

    from flask import Flask,Response
    from settings import config
    
    app = Flask(__name__)
    
    
    app.config.from_object(config['default'])
    
    print("*"*50)
    print(app.secret_key)
    app.secret_key = "123"
    print("*"*50)
    print(app.session_cookie_name)
    app.session_cookie_name = "session_ok"
    print("*"*50)
    
    @app.route('/home/')
    def home():
        return Response("home,hello")
    
    if __name__ == "__main__":
        app.run()
    

      

      setting.py源程序:

    import os
    import logging
    import datetime
    
    # print(__file__)
    # print(os.path.dirname(__file__))
    basedir = os.path.abspath(os.path.dirname(__file__))
    # print(basedir)
    
    class InfoFilter(logging.Filter):
        def filter(self, record):
            """
            only use INFO
            筛选,只需要INFO级别的log
            :param record:
            :return:
            """
            if logging.INFO <= record.levelno <logging.ERROR:
                # 已经是INFO级别了
                # 然后利用父类,返回1
                return super().filter(record)
            else:
                return 0
    
    
    class BaseConfig(object):
        DEBUG = False
        TESTING = False
        PROPAGATE_EXCEPTIONS = None
        PRESERVE_CONTEXT_ON_EXCEPTION = None
        SECRET_KEY = None
        PERMANENT_SESSION_LIFETIME = datetime.timedelta(31)
        USE_X_SENDFILE = False
        LOGGER_NAME = "app"
        LOGGER_HANDLER_POLICY = "always"
        SERVER_NAME = None
        APPLICATION_ROOT = None
        SESSION_COOKIE_NAME = "session"
        SESSION_COOKIE_DOMAIN = None
        SESSION_COOKIE_PATH = None
        SESSION_COOKIE_HTTPONLY = True
        SESSION_COOKIE_SECURE = False
        SESSION_REFRESH_EACH_REQUEST = True
        MAX_CONTENT_LENGTH = None
        SEND_FILE_MAX_AGE_DEFAULT =  datetime.timedelta(0, 43200)
        TRAP_BAD_REQUEST_ERRORS = False
        TRAP_HTTP_EXCEPTIONS = False
        EXPLAIN_TEMPLATE_LOADING = False
        PREFERRED_URL_SCHEME = 'http'
        JSON_AS_ASCII = True
        JSON_SORT_KEYS = True
        JSONIFY_PRETTYPRINT_REGULAR = True
        JSONIFY_MIMETYPE = 'application / json'
        TEMPLATES_AUTO_RELOAD = None
    
        LOG_PATH = os.path.join(basedir, 'logs')
        LOG_PATH_ERROR = os.path.join(LOG_PATH, 'error.log')
        LOG_PATH_INFO = os.path.join(LOG_PATH, 'info.log')
        LOG_FILE_MAX_BYTES =100*1024*1024
        # 轮转数量是10个
        LOG_FILE_BACKUP_COUNT = 10
    
        @classmethod
        def init_app(cls, app):
            pass
    
    class ProductionConfig(BaseConfig):
        DEBUG = False
    
    class DevelopmentConfig(BaseConfig):
    
        DEBUG = True
        SECRET_KEY = "avafaewffewfaew"
    
        @classmethod
        def init_app(cls, app):
            # BaseConfig.init_app(app)
            super().init_app(app)
    
            import logging
            from logging.handlers import RotatingFileHandler
            # Formatter
            formatter = logging.Formatter(
                '%(asctime)s %(levelname)s %(process)d %(thread)d '
                '%(pathname)s %(lineno)s %(message)s')
    
            # FileHandler Info
            file_hander_info = RotatingFileHandler(filename=cls.LOG_PATH_INFO)
            file_hander_info.setFormatter(formatter)
            file_hander_info.setLevel(logging.INFO)
            info_filter = InfoFilter()
            file_hander_info.addFilter(info_filter)
            app.logger.addHandler(file_hander_info)
    
            # FileHandler Error
            file_hander_error = RotatingFileHandler(filename=cls.LOG_PATH_ERROR)
            file_hander_error.setFormatter(formatter)
            file_hander_error.setLevel(logging.ERROR)
            app.logger.addHandler(file_hander_error)
    
    
    
    class TestConfig(BaseConfig):
    
        DEBUG = True
    
    config = {
        'development': DevelopmentConfig,
        'production': ProductionConfig,
        'testing': TestConfig,
        'default': DevelopmentConfig,
    }
    

    2.3、执行测试程序

      打印输出:

    **************************************************
    __get__() is called <Flask '__get__与__set__'> <class 'flask.app.Flask'>
    avafaewffewfaew
    __set__() is called <Flask '__get__与__set__'> 123
    **************************************************
    __get__() is called <Flask '__get__与__set__'> <class 'flask.app.Flask'>
    session
    __set__() is called <Flask '__get__与__set__'> session_ok
    **************************************************
    __get__() is called <Flask '__get__与__set__'> <class 'flask.app.Flask'>
    

      

      

     

      

  • 相关阅读:
    Linux 配置中文环境
    CookieContainer 丢失Cookie
    h5调用摄像头
    网络编程之Reactor 模式
    图形化命令行工具:
    关于VSTO调用Excel后进程无法退出的解决方案:
    ActionLink()与jquery更好地结合建造MVC网页:
    实现一个特殊栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
    用数组结构实现大小固定的栈和队列
    比较器整理
  • 原文地址:https://www.cnblogs.com/bad-robot/p/10060184.html
Copyright © 2011-2022 走看看