Inside Flask - app.py - 2
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_path
和 static_url_path
都是静态内容( javascript 、 CSS 等)的 URL 路径前缀,static_path
可能有歧义,已被弃用,改用 static_url_path
。
static_folder
为静态内容的目录,默认为 static
目录。它也影响静态内容的 URL 前缀,当没有设置 static_url_path
时,会使用 /<static_folder>
作为 URL 前缀。
template_folder
为模板目录,默认为 templates
。render_template
函数从目录中找模板文件,然后用 Jinja2 进行渲染。
instance_path
为应用实例的所在目录,用绝对路径表示。一般不需要指定,Flask 通过 import_name
可找到所在的模块,然后在后面加上 instance
。 instance
目录通常用来保存配置文件,当 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的更多相关文章
- Inside Flask - app.py - 1
Inside Flask - app.py - 1 除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模 ...
- Flask源码阅读-第四篇(flask\app.py)
flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...
- Inside Flask - 配置的实现
Inside Flask - 配置的实现 flask 的配置对象 app.config 本身使用很简单,无非就是以字典的形式使用,而它的实现,本身就是以字典的形式的. 在 flask/config.p ...
- Inside Flask - globals 全局变量(对象代理)
Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架 ...
- Inside Flask - flask.__init__.py 和核心组件
Inside Flask - flask.__init__.py 和核心组件 简单的示例 首先看看一个简单的示例.使用 Flask ,通常是从 flask 模块导入 Flask . request 等 ...
- 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 ...
- Inside Flask - json 处理
Inside Flask - json 处理 在处理 web api 时,json 是非常好用的数据交换格式,它结构简单,基本上各种主流的编程语言都有良好的支持工具. flask 中处理 json 时 ...
- Inside Flask - signal 信号机制
Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
随机推荐
- Html - 浮动的云朵
http://www.17sucai.com/download/9006.html @-webkit-keyframes animate-cloud { from { background-posit ...
- Hbuild - 使用海马玩模拟器调试
http://ask.dcloud.net.cn/question/13605 通过海马玩CMD(Droid4X_Settings_Tools_v1.1.5.bat) 设置模拟器的端口 269 ...
- CSS3系列:魔法系列
一.三角形 #wrap div{ margin: 0 auto; } .triangle_three { height:0px; width:0px; border-bottom:50px solid ...
- Redis在windows环境下的部署
一.下载 官网地址:http://redis.io/download Git地址:https://github.com/MSOpenTech/redis 注:官方无windows版本,需要window ...
- FZU 2124 bfs+vis记录
第一次团队训练赛的题 自己看完题没看到不能用舌头吃道具..以为是什么贪心混合bfs..果断放弃..悄悄的背锅了 然后其实比较简单 只是利用vis记录的时候要分两种状态记录 有没有道具 每到一个地方 就 ...
- Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析
欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就standalone部署方式下的容错性问题做比较细致的分析,主要回答standalone部署方式下的包含哪些主要节点,当某一类节点出现问题时,系统是如 ...
- jQuery 判断表单中多个 input text 中至少有一个不为空
html: 名称1:<input class="seasoning_name" type="text" name="seasoning_name ...
- iOS标准时间与时间戳相互转换
iOS标准时间与时间戳相互转换 (2012-07-18 17:03:34) 转载▼ 标签: ios 时间戳 标准时间 格式 设置 转化 杂谈 分类: iPhone开发 设置时间显示格式: NS ...
- 必应(Bing)每日图片获取API
必应(Bing)每日图片获取API January 11, 2015 API http://lab.dobyi.com/api/bing.php 介绍 Value Description title ...
- linux下php-fpm 启动参数及重要配置
约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.iniI. php-fp ...