Inside Flask - app.py - 2

Flask 初始化参数

Flass 类是 Flask 框架的核心,一个 flask 对象处理视图函数注册、URL规则、模板配置、参数设置等等。

一般地, Flask 在使用时,先创建一个 flask 对象:

from flask import Flask

app = Flask(__name__)

除此之后, Flask 的初始化支持更多的参数,其完整的函数签名为:

def __init__(self, import_name, static_path=None, static_url_path=None,
static_folder='static', template_folder='templates',
instance_path=None, instance_relative_config=False)

这些参数里面,可能最需要说明的是 import_name。一般地,在单模块方式(即只使用一个文件包含全部代码)下使用 Flask , import_name 参数会使用 __name__ 。而 Flask 建议,以 package 的方式使用 Flask (即 yourapplication/app.py 形式,yourapplication 包内包含其它 Flask 相关代码),就应该采用硬编码的 'yourapplication' ,或者是 __name__.split('.')[0] 的方式。由于一些扩展,需要使用 import_name 来判断 Flask 应用的范围(在整个 yourapplication 包内,而 __name__ 只包括了 yourapplication.app 模块),从而为整个 Flask 应用提供更好的调试信息。

static_pathstatic_url_path 都是静态内容( javascript 、 CSS 等)的 URL 路径前缀,static_path 可能有歧义,已被弃用,改用 static_url_path

static_folder 为静态内容的目录,默认为 static 目录。它也影响静态内容的 URL 前缀,当没有设置 static_url_path 时,会使用 /<static_folder> 作为 URL 前缀。

template_folder 为模板目录,默认为 templatesrender_template 函数从目录中找模板文件,然后用 Jinja2 进行渲染。

instance_path 为应用实例的所在目录,用绝对路径表示。一般不需要指定,Flask 通过 import_name 可找到所在的模块,然后在后面加上 instanceinstance 目录通常用来保存配置文件,当 instance_relative_config 为 True 时,app.config.from_pyfile 会尝试从这个目录加载配置文件(行 344 、 600 )。

Flask 初始化过程

Flask 的初始化过程,设置整个 Flask 应用的基本环境,函数表等等(Flask 继承了 flask.helper._PackageBoundObject,它主要是包含了几个简单属性初始化)。

首先,记录 static_path static_url_path instance_path 这几个属性。

344 行初始化 config。 它使用 self.make_config 创建一个 config.Config 对象,当参数中设置 instance_relative_config=True 时,config 中使用 instance 路径为默认的配置文件路径,可从这个路径中加载配置文件。

347 - 348 行设置日志的默认参数。

354 行开始初始化函数表,并把各个函数表都设置为空,这些函数表包括:

self.view_functions         # 视图函数,通过 route 装饰器注册
self._error_handlers # 应使用 error_handler_spec
self.error_handler_spec # 错误处理,通过 errorhandler 装饰器注册
self.url_build_error_handlers # 路径构建错误(如 url_for )时回调函数
self.before_request_funcs # 请求开始前回调函数,通过 before_request 装饰器注册
self.before_first_request_funcs # 第一个请求前回调函数,用 befort_first_request 装饰器注册
self.after_request_funcs # 请求完成后回调函数,用 after_request 装饰器注册
self.teardown_request_funcs # 请求完成后的调用,用 teardown_request 装饰器注册
self.teardown_appcontext_funcs # 清理上下文
self.url_value_preprocessors # URL 特殊处理,在行 1656 进行
self.url_default_functions # URL 处理,在行 1618 进行
self.template_context_processors # 模板上下文处理,用 context_processor 装饰器注册
self.blueprints # blueprint
self.extensions # 扩展
self.url_map
self._got_first_request # 标记是否已进行过请求
self._before_request_lock # 锁

最后,把 static 加到 URL 规则中:

if self.has_static_folder:
self.add_url_rule(self.static_url_path + '/<path:filename>',
endpoint='static',
view_func=self.send_static_file)

初始化完成后,大部分的函数表设置为空白的字典或列表,后续的加载中,可通过相应的 decorator 装饰视图函数、回调函数,从而把需要实现的功能注册到相应的函数表。

Inside Flask - app.py - 2的更多相关文章

  1. Inside Flask - app.py - 1

    Inside Flask - app.py - 1 除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模 ...

  2. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

  3. Inside Flask - 配置的实现

    Inside Flask - 配置的实现 flask 的配置对象 app.config 本身使用很简单,无非就是以字典的形式使用,而它的实现,本身就是以字典的形式的. 在 flask/config.p ...

  4. Inside Flask - globals 全局变量(对象代理)

    Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...

  5. Inside Flask - flask.__init__.py 和核心组件

    Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...

  6. Flask - app.debug=True,python manage.py和export FLASK_DEBUG=True,flask run的不同。

    TL;DR,可以直接看下面的总结 问题1:为什么app.config['DEBUG'] = True,然后flask run并没有开启debugger和reloading,而直接运行脚本(python ...

  7. Inside Flask - json 处理

    Inside Flask - json 处理 在处理 web api 时,json 是非常好用的数据交换格式,它结构简单,基本上各种主流的编程语言都有良好的支持工具. flask 中处理 json 时 ...

  8. Inside Flask - signal 信号机制

    Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...

  9. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

随机推荐

  1. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  2. java工程包的命名(-dev.jar,-javadoc.jar,jar)

    1.-javadoc.jar 这个应该是一个doc包,就是API,相当于帮助文档,用来说明类.方法.静态变量 都是干什么的. 2.-dev.jar,.jar都有可能包含源码,也可能都不包含

  3. Java常用类之Properties类

    1.特性 Properties类表示了一个持久的属性集,可保存在流中或从流中加载,实现内存和文件的交互.Properties继承了Hashtable<Object,Object>类,可以使 ...

  4. “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决

    问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> ...

  5. Apache POI使用详解

    Apache POI使用详解 1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案 ...

  6. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  7. IE6 — 你若安好,便是晴天霹雳 [ 乱弹 ]

    为什么还有人在用IE6?估计和中国的盗版业有很大关系吧.小白的电脑启不来了,请人重装系统,一张古老的Ghost搞定,IE6便落地生根.今天碰到一例报告说某网站在IE6下丑陋吓人,无心无力去解决,于是来 ...

  8. 鼠标选择文字事件js代码,增加层问题

    在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...

  9. linux下mysql定时备份数据库

    linux下mysql定时备份数据库 (2010-10-21 12:40:17) 转载▼ 标签: 杂谈   一.用命令实现备份 首页进入mysql的bin目录 1.备份数据#mysqldump -uu ...

  10. HOSTS文件详解【win|mac】

    hosts文件是一个用于储存计算机网络中各节点信息的计算机文件.这个文件负责将主机名映射到相应的IP地址. hosts文件通常用于补充或取代网络中DNS的功能.和DNS不同的是,计算机的使用者可以直接 ...