Flask 程序的基本结构
1、初始化
所有Flask程序都必须创建一个程序实例。web服务器使用一种名为Web服务器网关借口的协议,把接收自客户端的所有请求都转交给这个对象处理。
from flask import Flask
app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。
2、路由和视图函数
客户端把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间关系的程序称为路由。
@app.route('/')
def index():
return '<h1>Hello Flask!</h1>'
像index()这样的函数称为视图函数。视图函数返回的响应可以包含HTML的简单字符串,也可以是复杂的表单。
@app.route('/user/name')
def index(name):
return '<h1>Hello %s!</h1>' % name
尖括号内的内容就是动态内容,任何能匹配静态部分的URL都会映射到这个路由上。
路由中的动态部分默认使用字符串,不过也可以使用类型定义。例如,/usr/<int:id>只会匹配动态片段为整数的URL。Flask支持在路由中使用int、float和path类型。
3、启动服务器
if __name__ == '__main__':
app.run(debug=True)
有一些选项参数可被app.run()函数接受用于设置web服务器的操作模式。在开发过程中启用调试模式会带来一些便利,比如激活调试器和重载程序。要想启用调试模式,我们可以把debug参数设为True。
4、一个完整的程序
#!/usr/bin/env python from flask import Flask
app = Flask(__name__) @app.route('/')
def index():
return '<h1>Hello Flask!</h1>' if __name__ == '__main__':
app.run(debug=True)

包含动态路由的Flask程序
#!/usr/bin/env python from flask import Flask
app = Flask(__name__) @app.route('/')
def index():
return '<h1>Hello Flask!</h1>' @app.route('/user/<name>')
def user(name):
return '<h1>Hello,%s!</h1>' % name if __name__ == '__main__':
app.run(debug=True)
http://127.0.0.1:5000/user/cairui

5、请求--响应循环
下面介绍这个框架的一些设计理念。
①程序和请求上下文
为了避免大量可有可无的参数把视图函数弄得一团糟,Flask请求使用上下文临时把某些对象变为全局可访问。
from flask import request
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
return '<p>Your browser is %s</p>' % user_agent
Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
线程是可单独管理的最小指令集。进程经常使用多个活动线程,有时还会共享内存或文件句柄等资源。多线程web服务器会创建一个线程池,再从线程池中选择一个线程用于处理接收到的请求。
(表)Flask上下文全局变量
| 变量名 | 上下文 | 说 明 |
| current_app | 程序上下文 | 当前激活程序的程序实例 |
| g | 程序上下文 | 当前请求时用作临时存储对象。每次请求都会重设这个变量 |
| request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容 |
| session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值得词典 |
Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。
from hello import app
from flask import current_app
current_app.name =========================================
Traceback (most recent call last)
from hello import app
from flask import current_app
app_ctx = app.app_context()
app_ctx.push()
current_app.name
②请求调度
from hello import app
app.url_map
③请求钩子
有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数的功能,注册函数可在请求被分发到视图函数之前或之后调用。
Flask支持以下4种钩子:
- before_first_request 注册一个函数,在处理第一个请求之前运行。
- before_request 注册一个函数,在每次请求之前运行
- after_request 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
- teardown_request 注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
- after_request 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
- before_request 注册一个函数,在每次请求之前运行
- before_first_request 注册一个函数,在处理第一个请求之前运行。
④响应
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>This carries a cookie!</h1>')
response.set_cookie('answer','42')
return response
6、Flask扩展
使用Flask-Script支持命令行选项

#!/usr/bin/env python from flask_script import Manager from flask import Flask
app = Flask(__name__)
manager = Manager(app)
@app.route('/')
def index():
return '<h1>Hello Flask!</h1>' @app.route('/user/<name>')
def user(name):
return '<h1>Hello,%s!</h1>' % name if __name__ == '__main__':
manager.run()
Flask 程序的基本结构的更多相关文章
- flask 程序结构概括
以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...
- 基于Python的Flask的开发实战(第二节程序的基本结构)
1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...
- flask框架的教程--程序的基本结构[二]
一个简单的程序 from flask import Flask # 实例化app 对象 app = Flask(__name__) @app.route('/') def index(): retur ...
- Flask 3 程序的基本结构2
NOTE 1.hello.py 通过修饰器的route方法添加动态路由: #!/usr/bin/env python from flask import Flask app = Flask(__nam ...
- Flask 2 程序的基本结构1
NOTE 1.初始化:所有的Flask程序都必须创建一个程序实例. app = Flask(__name__) # 向Flask的构造函数传入参数__name__ 2.路由和视图函数(VF): Cli ...
- Flask【第11篇】:整合Flask中的目录结构
整合Flask中的目录结构 一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import ...
- 一个简单的flask程序
初始化 所有Flask程序都必须创建一个程序实例. 程序实例是Flask类的对象,经常使用下述代码创建: from flask import Flask app = Flask(__name__) F ...
- Android程序的目录结构
本篇文章我们将介绍Android应用程序的目录结构.本目录下有如图的目录结构: 下面我们来一 一介绍: 1. Src:该目录中存放的是该项目的源代码 2. Gen:该目录下的文件全部都 ...
- The way to Go(6): Go程序的基本结构和要素
Reference: Github: Go Github: The way to Go Go程序的基本结构和要素 helloworld.go: package main import "fm ...
随机推荐
- 机器学习:PCA(高维数据映射为低维数据 封装&调用)
一.基础理解 1) PCA 降维的基本原理 寻找另外一个坐标系,新坐标系中的坐标轴以此表示原来样本的重要程度,也就是主成分:取出前 k 个主成分,将数据映射到这 k 个坐标轴上,获得一个低维的数据集. ...
- PV 和 UV IP
PV(page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标. 高手对pv的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面.这里 ...
- 杂项-IIS:发布杂项
ylbtech-杂项-IIS:发布杂项 1. 测试连接返回顶部 1.1.授权 无法验证对路径的访问. 1.2.详情信息 服务器配置为将传递身份验证和内置帐户一起使用,以访问指定的物理路径.但是,IIS ...
- 查看,创建,删除,映射rbd镜像
标签(空格分隔): ceph,ceph实验,pg 1. 创建镜像: [root@node3 ~]# rbd create testpool/foo --size 1024 2. 查看镜像信息: [ro ...
- 类型:.net;问题:C#lambda表达式;结果:Lambda表达式详解
Lambda表达式详解 前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1 ...
- 用sass的minix定义一些代码片段,且可传参数
/** *@module功能 *@description生成全屏方法 *@method fullscreen *@version 1.7.0 *@param{Integer}$z-index 指定层叠 ...
- Android getWidth和getMeasuredWidth的区别
getWidth 得到的事某个View的实际尺寸. getMeasuredWidth 得到的是某个View想要在parent view里面占的大小 相比你也见过这样的解释,听起来这样的解释也是云里雾里 ...
- 关于WebGIS开源解决方案的探讨(转)
关于WebGIS开源解决方案的探讨 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 公司目前的多数项目采 ...
- Luogu 2149 [SDOI2009]Elaxia的路线
感觉这题可以模板化. 听说spfa死了,所以要练堆优化dijkstra. 首先对$x_{1},y_{1},x_{2},y_{2}$各跑一遍最短路,然后扫一遍所有边看看是不是同时在两个点的最短路里面,如 ...
- Entity Framework Tutorial Basics(27):Update Entity Graph
Update Entity Graph using DbContext: Updating an entity graph in disconnected scenario is a complex ...