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 server的语句

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. php的具体配置学习笔记

    1.将php配置为apache的一个模块,使用loadmodule指令完成. 2.写下面的语句,此外需强调的是,每次配置都需要重新启动apache 3.php文件,要指定将其php模块来处理 4.PH ...

  3. 【液晶模块系列基础视频】4.2.X-GUI图形界面库-画矩形函数简介

    [液晶模块系列基础视频]4.2.X-GUI图形界面库-画矩形函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址: ...

  4. github上有android开源项目

    下面是一些比较好的开源项目,总共分为5大类,也许对某一些人有用,有些项目也许将来某一天对自己也有用,所以整理到此,希望对大家有帮助.首先声明非原创,这篇blog的目的是分享给那些可能需要的人. htt ...

  5. Scrum会议3

    组名称:天天向上 项目名称:连连看 参会成员:王森(Master)张金生 张政 栾骄阳 时间:2016.10.18 已完成内容: 1.GUI布局设计 2.通过在网上大量阅览代码,大体了解连连看游戏制作 ...

  6. SQLServer组件

    1.客户端 2.协议层 3.查询处理器 4.存储引擎 5.数据库操作系统 如下图:

  7. 使用phpstorm和xdebug实现远程调试

    使用phpstorm和xdebug实现远程调试 2012-05-23 10:06:35 vs的断点调试功能很强大有木有,能查看所有变量有木有.php调试很麻烦有木有,echo,var_dump写得你想 ...

  8. UDP 构建p2p打洞过程的实现原理(持续更新)

    UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55)   阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...

  9. git的某些默认行为--会推送pull的内容,即使commit的时候不显示

    今天一不小心又在git上犯了个大错误,用gitflow之前进行过pull分支的操作,然后用IDE选择修改的文件提交,可是推送的时候把pull的内容也推送到远程服务器了,提交的时候用git status ...

  10. 来到这里,我放弃了多少- UI基础-疯狂猜图,我们都疯狂了-

    小问题也要问 学习最重要的是 自律 我昨天晚上3点睡的, 这两天一点也没睡 0.99*0.99  每天差一点 日积月累就很多了 关键字,在字典里查一下,在类里面查查 瑞详博客下载器 跑步后精神多了,白 ...