Flask开发笔记之一

来源:互联网 发布:windows线程同步事件 编辑:程序博客网 时间:2024/04/29 22:09

Flask开发笔记之一

 

1       关于Python Web框架

除了Flask,常见的PythonWeb框架还有:

l   Django:全能型Web框架;

l   web.py:一个小巧的Web框架;

l   Bottle:和Flask类似的Web框架;

l   Tornado:Facebook的开源异步Web框架。

Web 服务器使用一种名为 Web服务器网关接口的协议,把接收自客户端的所有请求都转交给这个对象处理 。

Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。Flask 用这个参数决定程序的根目录,以便找到相对于程序根目录的资源文件位置。在大多数程序中,Python 的 __name__ 变量就是所需的值。

 

1.1       路由和视图函数

先看个实例如下(安装完flask,即可运行如下python代码):

from flask importFlask
app = Flask(__name__)
@app.route('/')
def index():
   
return '<h1>Hello World!</h1>'
if
__name__ =='__main__':
    app.run(
debug=True)

__name__ =='__main__'是 Python 的惯用法,确保直接执行此脚本时才启动服务器。后面我们继续看路由、装饰器。

程序实例用run方法启动Flask继承的开发Web服务器。

服务器启动后,会进入轮询,等待并处理请求。轮询会一直进行,直到程序停止,比如按Ctrl-C键。debug=True表示启用调试模式,方便调试。

1.1.1       路由

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

程序实例保存了一个 URL 到 Python 函数的映射关系,处理URL 和函数之间关系的程序成为路由。 

index()函数放在@app.route('/')后面,所以就是把index()函数注册为路由。

1.1.2       修饰器

Flask 中定义路由最简单的方式是使用程序提供的 app.route 修饰器,把修饰的函数注册为路由。修饰器是Python语言的标准特性,可以使用不同的方式修改函数的行为。惯常用法是使用修饰器把函数注册为事件的处理程序。

1.2       请求响应

Flask 使用上下文临时把某些对象变为全局可访问。

1.3       请求上下文

Flask 使用上下文让特定的变量在一个线程中全局可访问,与此同时还不会干扰其他线程。在 Flask 中有两种上下文:程序上下文和请求上下文,这两种上下文提供的变量。

变量名

上下文

说明

current_app

程序上下文

当前激活程序的程序实例

g

程序上下文

处理请求时用作临时存储的对象,每次请求都会重设这个变量

request

请求上下文

请求对象,封装了客户端发出的 HTTP 请求中的内容

session

请求上下文

用户绘画,用户存储请求之间需要“记住”的值的字典

 

1.4       请求钩子

有时在处理请求之前或者之后执行代码会很有用,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。请求钩子使用修饰器实现。Flask 支持以下四种钩子

钩子名

上下文

before_first_request

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

before_request

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

after_request

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

teardown_request

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

可以使用set_cookie来设置Cookie ,如下代码

def index():    response = make_response('<h1>This document carries a cookie!</h1>')    response.set_cookie('answer', '42')    return response

 

 

2       实例

2.1       普通表单例子

from flask import Flaskfrom flask import requestapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])def home():    return '<h1>Home</h1>'@app.route('/signin', methods=['GET'])def signin_form():    return '''<form action="/signin" method="post">              <p><input name="username"></p>              <p><input name="password" type="password"></p>              <p><button type="submit">Sign In</button></p>              </form>'''@app.route('/signin', methods=['POST'])def signin():    # 需要从request对象读取表单内容:    if request.form['username']=='admin' and request.form['password']=='password':        return '<h3>Hello, admin!</h3>'    return '<h3>Bad username or password.</h3>'if __name__ == '__main__':    app.run()

 

3       参考

官方文档链接:http://docs.jinkan.org/docs/flask/

 

 

 

 


原创粉丝点击