• flask config笔记


    #从flask这个包中导入Flask这个类
    #Flask这个类是项目的核心,以后很多操作都是基于这个类的对象
    #注册url、注册蓝图等都是基于这个类的对象
    from flask import Flask
    
    import config #配置文件
    
    #创建一个Flask对象,传递__name__参数进去
    #__name__参数的作用:
    #1.可以规定模板和静态文件的查找路劲
    #2.以后一些Flask插件,比如Flask-migrate、Flask-SQLAlchemy如果报错了,
    #那么Flask可以通过这个参数找到具体的报错位置
    app = Flask(__name__)
    
    # app.debug = True #第二中模式debug
    
    # app.config.update(DEBUG=True)#第三种模式
    #可以看出config其实是一个字典
    
    app.config.from_object(config) #第四种模式,从配置文件中导入 

    #为什么config的debug必须是大写

    我们看下
    from_object的源码

    
    
    
    
    
    def from_object(self, obj):
    """Updates the values from the given object. An object can be of one
    of the following two types:

    - a string: in this case the object with that name will be imported
    - an actual object reference: that object is used directly

    Objects are usually either modules or classes. :meth:`from_object`
    loads only the uppercase attributes of the module/class. A ``dict``
    object will not work with :meth:`from_object` because the keys of a
    ``dict`` are not attributes of the ``dict`` class.

    Example of module-based configuration::

    app.config.from_object('yourapplication.default_config')
    from yourapplication import default_config
    app.config.from_object(default_config)

    You should not use this function to load the actual configuration but
    rather configuration defaults. The actual config should be loaded
    with :meth:`from_pyfile` and ideally from a location not within the
    package because the package might be installed system wide.

    See :ref:`config-dev-prod` for an example of class-based configuration
    using :meth:`from_object`.

    :param obj: an import name or object
    """
    if isinstance(obj, string_types):
    obj = import_string(obj)
    for key in dir(obj):#这里用dir()内置函数查看文件参数
    if key.isupper():#这里判断了必须大写
    self[key] = getattr(obj, key)这里获取debug的值


     再看下from_pyfile的源码

     def from_pyfile(self, filename, silent=False):
            """Updates the values in the config from a Python file.  This function
            behaves as if the file was imported as module with the
            :meth:`from_object` function.
    
            :param filename: the filename of the config.  This can either be an
                             absolute filename or a filename relative to the
                             root path.
            :param silent: set to ``True`` if you want silent failure for missing
                           files.
    
            .. versionadded:: 0.7
               `silent` parameter.
            """
            filename = os.path.join(self.root_path, filename)
            d = types.ModuleType('config')
            d.__file__ = filename #
            try:
                with open(filename, mode='rb') as config_file:
                    exec(compile(config_file.read(), filename, 'exec'), d.__dict__)
            except IOError as e:
                if silent and e.errno in (
                    errno.ENOENT, errno.EISDIR, errno.ENOTDIR
                ):
                    return False
                e.strerror = 'Unable to load configuration file (%s)' % e.strerror
                raise
            self.from_object(d)
            return True

    第一个知识点:
    d.__file__ = filename #__file__
    文件的绝对路径
    第二个知识点:
    compile() 函数将一个字符串编译为字节代码。


    参数source:字符串或者AST(Abstract Syntax Trees)对象。

    参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。

    参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。如果是exec类型,表示这是一个序列语句,可以进行运行;如果是eval类型,表示这是一个单一的表达式语句,可以用来计算相应的值出来;如果是single类型,表示这是一个单一语句,采用交互模式执行,在这种情况下,如果是一个表达式,一般会输出结果,而不是打印为None输出。


    exec第三个知识点:
    这个暂时放下
     
  • 相关阅读:
    递归
    简单装饰器
    带函数参数的装饰器(复杂装饰器)的例子
    (转)MySQL 线程池内幕
    (转)http://blog.csdn.net/renfufei/article/details/38474435
    (转)RabbitMQ 中文文档
    (转) rabbitmq应用场景
    (转) Rabbitmq学习笔记
    (转)更换镜像rootvg卷组中的硬盘
    (转)AIX下镜像制作与取消,更换硬盘问题
  • 原文地址:https://www.cnblogs.com/wuheng-123/p/9658276.html
Copyright © 2020-2023  润新知