1、初始化

  所有Flask程序都必须创建一个程序实例。web服务器使用一种名为Web服务器网关借口的协议,把接收自客户端的所有请求都转交给这个对象处理。

  1. from flask import Flask
  2. app = Flask(__name__)

  Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。

2、路由和视图函数

客户端把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间关系的程序称为路由。

  1. @app.route('/')
  2. def index():
  3. return '<h1>Hello Flask!</h1>'

像index()这样的函数称为视图函数。视图函数返回的响应可以包含HTML的简单字符串,也可以是复杂的表单。

  1. @app.route('/user/name')
  2. def index(name):
  3. return '<h1>Hello %s!</h1>' % name

尖括号内的内容就是动态内容,任何能匹配静态部分的URL都会映射到这个路由上。

路由中的动态部分默认使用字符串,不过也可以使用类型定义。例如,/usr/<int:id>只会匹配动态片段为整数的URL。Flask支持在路由中使用int、float和path类型。

3、启动服务器

  1. if __name__ == '__main__':
  2. app.run(debug=True)

有一些选项参数可被app.run()函数接受用于设置web服务器的操作模式。在开发过程中启用调试模式会带来一些便利,比如激活调试器和重载程序。要想启用调试模式,我们可以把debug参数设为True。

4、一个完整的程序

  1. #!/usr/bin/env python
  2.  
  3. from flask import Flask
  4. app = Flask(__name__)
  5.  
  6. @app.route('/')
  7. def index():
  8. return '<h1>Hello Flask!</h1>'
  9.  
  10. if __name__ == '__main__':
  11. app.run(debug=True)

包含动态路由的Flask程序

  1. #!/usr/bin/env python
  2.  
  3. from flask import Flask
  4. app = Flask(__name__)
  5.  
  6. @app.route('/')
  7. def index():
  8. return '<h1>Hello Flask!</h1>'
  9.  
  10. @app.route('/user/<name>')
  11. def user(name):
  12. return '<h1>Hello,%s!</h1>' % name
  13.  
  14. if __name__ == '__main__':
  15. app.run(debug=True)

http://127.0.0.1:5000/user/cairui

5、请求--响应循环

下面介绍这个框架的一些设计理念。

①程序和请求上下文

为了避免大量可有可无的参数把视图函数弄得一团糟,Flask请求使用上下文临时把某些对象变为全局可访问。

  1. from flask import request
  2.  
  3. @app.route('/')
  4. def index():
  5. user_agent = request.headers.get('User-Agent')
  6. return '<p>Your browser is %s</p>' % user_agent

Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。

线程是可单独管理的最小指令集。进程经常使用多个活动线程,有时还会共享内存或文件句柄等资源。多线程web服务器会创建一个线程池,再从线程池中选择一个线程用于处理接收到的请求。

(表)Flask上下文全局变量

变量名 上下文 说  明
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 当前请求时用作临时存储对象。每次请求都会重设这个变量
request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
session 请求上下文 用户会话,用于存储请求之间需要“记住”的值得词典

Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。

  1. from hello import app
  2. from flask import current_app
  3. current_app.name
  4.  
  5. =========================================
  6. Traceback (most recent call last)
  1. from hello import app
  2. from flask import current_app
  3. app_ctx = app.app_context()
  4. app_ctx.push()
  5. current_app.name

②请求调度

  1. from hello import app
  2. app.url_map

③请求钩子

有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数的功能,注册函数可在请求被分发到视图函数之前或之后调用。

Flask支持以下4种钩子:

    • before_first_request  注册一个函数,在处理第一个请求之前运行。

      • before_request  注册一个函数,在每次请求之前运行

        • after_request  注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行

          • teardown_request  注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

④响应

  1. @app.route('/')
  2. def index():
  3. return '<h1>Bad Request</h1>', 400
  1. from flask import make_response
  2. @app.route('/')
  3. def index():
  4. response = make_response('<h1>This carries a cookie!</h1>')
  5. response.set_cookie('answer','42')
  6. return response

6、Flask扩展

使用Flask-Script支持命令行选项

  1. #!/usr/bin/env python
  2.  
  3. from flask_script import Manager
  4.  
  5. from flask import Flask
  6. app = Flask(__name__)
  7. manager = Manager(app)
  8. @app.route('/')
  9. def index():
  10. return '<h1>Hello Flask!</h1>'
  11.  
  12. @app.route('/user/<name>')
  13. def user(name):
  14. return '<h1>Hello,%s!</h1>' % name
  15.  
  16. if __name__ == '__main__':
  17. manager.run()

  

Flask 程序的基本结构的更多相关文章

  1. flask 程序结构概括

    以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...

  2. 基于Python的Flask的开发实战(第二节程序的基本结构)

    1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...

  3. flask框架的教程--程序的基本结构[二]

    一个简单的程序 from flask import Flask # 实例化app 对象 app = Flask(__name__) @app.route('/') def index(): retur ...

  4. Flask 3 程序的基本结构2

    NOTE 1.hello.py 通过修饰器的route方法添加动态路由: #!/usr/bin/env python from flask import Flask app = Flask(__nam ...

  5. Flask 2 程序的基本结构1

    NOTE 1.初始化:所有的Flask程序都必须创建一个程序实例. app = Flask(__name__) # 向Flask的构造函数传入参数__name__ 2.路由和视图函数(VF): Cli ...

  6. Flask【第11篇】:整合Flask中的目录结构

    整合Flask中的目录结构 一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import ...

  7. 一个简单的flask程序

    初始化 所有Flask程序都必须创建一个程序实例. 程序实例是Flask类的对象,经常使用下述代码创建: from flask import Flask app = Flask(__name__) F ...

  8. Android程序的目录结构

    本篇文章我们将介绍Android应用程序的目录结构.本目录下有如图的目录结构: 下面我们来一 一介绍: 1.     Src:该目录中存放的是该项目的源代码 2.     Gen:该目录下的文件全部都 ...

  9. The way to Go(6): Go程序的基本结构和要素

    Reference: Github: Go Github: The way to Go Go程序的基本结构和要素 helloworld.go: package main import "fm ...

随机推荐

  1. canvas路径绘制

    惯例,先贴代码: 1 /** 2 * Created by Administrator on 2016/1/27. 3 */ 4 function draw (id){ 5 var canvas = ...

  2. MySQL 备份脚本--mysqldump在slave 上进行备份

    MySQL 备份脚本--mysqldump在slave 上进行备份 使用mysqldump在slave上进行备份,建议使用stop slave sql_thread,start slave sql_t ...

  3. The Commercial Open-Source Monitoring Landscape

    As enterprises have adopted open-source monitoring tools, there is growing market demand by enterpri ...

  4. paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控

    #!/usr/bin/python #-*- coding: UTF-8 -*- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  5. log4j配置文件加载方式

    使用背景: apache的log4j是一个功能强大的日志文件,当我们使用eclipse等IDE在项目中配置log4j的时候,需要知道我们的配置文件的加载方式以及如何被加载的. 加载方式: (1).自动 ...

  6. C#改变LInqToSQL的引用地址,读取config的数据库字符串

    C#改变LInqToSQL的引用地址,读取config的数据库字符串修改Properties 下 Settings.Settings 下 Settings.Designer.cs 下 return ( ...

  7. java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    执行Hive查询: Console是这样报错的 java.sql.SQLException: Error from org.apache.hadoop.hive.ql.exec.mr.MapRedTa ...

  8. Hbase批量插入优化记录

    2016年5月11日10:08:29 hbase原本的put方式是一条一条的put,在客户端修改 AutoFlush 将HTable的setAutoFlush设为false,可以支持客户端批量更新.即 ...

  9. spring分模块开发

  10. jQuery-图片的放大镜显示效果(需要大小图)

    1.default.aspx <%@ Page Language=.2em; height:.1em; text-align:center; font-size:128px;}    .zxx_ ...