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. ...
随机推荐
- SQL - 分页存储过程
http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...
- java工程包的命名(-dev.jar,-javadoc.jar,jar)
1.-javadoc.jar 这个应该是一个doc包,就是API,相当于帮助文档,用来说明类.方法.静态变量 都是干什么的. 2.-dev.jar,.jar都有可能包含源码,也可能都不包含
- Java常用类之Properties类
1.特性 Properties类表示了一个持久的属性集,可保存在流中或从流中加载,实现内存和文件的交互.Properties继承了Hashtable<Object,Object>类,可以使 ...
- “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决
问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> ...
- Apache POI使用详解
Apache POI使用详解 1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案 ...
- hibernate将本地SQL查询结果封装成对象
hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...
- IE6 — 你若安好,便是晴天霹雳 [ 乱弹 ]
为什么还有人在用IE6?估计和中国的盗版业有很大关系吧.小白的电脑启不来了,请人重装系统,一张古老的Ghost搞定,IE6便落地生根.今天碰到一例报告说某网站在IE6下丑陋吓人,无心无力去解决,于是来 ...
- 鼠标选择文字事件js代码,增加层问题
在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...
- linux下mysql定时备份数据库
linux下mysql定时备份数据库 (2010-10-21 12:40:17) 转载▼ 标签: 杂谈 一.用命令实现备份 首页进入mysql的bin目录 1.备份数据#mysqldump -uu ...
- HOSTS文件详解【win|mac】
hosts文件是一个用于储存计算机网络中各节点信息的计算机文件.这个文件负责将主机名映射到相应的IP地址. hosts文件通常用于补充或取代网络中DNS的功能.和DNS不同的是,计算机的使用者可以直接 ...