Flask学习笔记02--Flask基本结构

来源:互联网 发布:网络培训平台 编辑:程序博客网 时间:2024/05/29 08:00

1. 初始化

所有的flask程序都必须创建一个程序实例,程序实例是Flask类的对象,使用下面的代码创建:

from flask import Flaskapp = Flask(__name__)

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

2. 路由和视图函数

客户端将请求发送到web服务器,web服务器再将请求发送到Flask的程序实例,但是程序实例需要知道对每个URL请求运行哪些代码,所以保存URL到python函数的对应关系。

路由即是处理URL和函数之间关系的程序,Flask中使用路由最简便的方式就是使用程序实例提供的app.route修饰器,把修饰器的函数注册为路由,下面为根目录的实例:

@app.route('/')def index():return "<h1>hello,Flask</h1>"

像index()这样的函数称之为视图函数。视图函数返回的响应可以使包含HTML的简单字符串,也可以是复杂的表单,等等,不过一般来说不会再python代码中嵌入响应字符串,生成响应的正确方法是使用模板。

很多地址中间都包含可变的部分,例如www.baidu.comnews,www.baidu.com/picture等等,Flask支持这种类型的URL,只需要在修饰器中使用特殊的句法。例如:

@app.route('/user/<name>')def user(name):    return '<h1>hello, %s</h1>' % name

尖括号中的内容就是动态部分,任何能够匹配静态部分的URL都会映射到这个路由上,调用视图函数时,Flask会将动态部分作为参数传入函数。

路由中的动态部分默认为字符串,不过也可以使用类型定义,例如/user/<int:id>,只会匹配动态片段id为整数的URL。Flask支持在路由中使用intfloatpath类型。path类型就是字符串,但是不会将斜线作为分隔符,而是当做动态片段的一部分,例如:/user/<path:sss>能够匹配/user/news/person/getAll

3. 启动服务器

程序实例使用run方法启动Flask集成的开发Web服务器:

if __name = '__main__':    app.run(debug=True)

__name__ = '__main__'是python的一种用法,保证直接执行脚本时启动开发服务器,如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run()。

在开发过程中启用debug=True启动调试模式,方便调试。

4. 完整的程序实例

先创建一个文件夹,在内部创建一个test.py,写入以下代码:

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

在命令行中使用 python test.py 运行这个程序,并在浏览器中输入http://127.0.0.1:5000/,可以看到页面中出现Hello World!。

下面是上面程序的扩展,可以从URL中获取动态内容并显示在页面中:

from flask import Flaskapp = Flask(__name__)@app.route('/')def index():    return '<h1>Hello World!</h1>'@app.route('/user/<name>')def user(name):    return '<h1>Hello, %s!</h1>' % nameif __main__ = '__main__':    app.run(debug=True)

然后在浏览器中输入http://127.0.0.1:5000/user/aaa可以看到页面中出现Hello,aaa!。

5. 请求-响应循环

5.1 程序和请求上下文

Flask从客户端接受请求后,要让视图函数能够访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的HTTP请求。

要让视图函数能够访问请求对象,可以将其作为参数传入视图函数,但是这会导致程序中每个视图函数都会增加一个参数。除了访问请求对象,如果视图函数在处理请求的同时还要访问其他对象,情况会变得糟糕。

为了避免大量可有可无的参数,Flask使用上下文临时把某些对象变为全局可访问,有了上下文,就可以写出下面的视图函数:

from flask import request@app.route('/')def index():    user_agent = request.headers.get('User-Agent')    return '<p>你的浏览器是 %s</p>' % user_agent

中文报错请在文件最前面加上# -*- coding:utf-8 -*-

在这个视图函数中我们把request当做全局变量来使用,但是request不是全局变量。

试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的 request 对象必然不同。Falsk 使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。

在 Flask 中有两种上下文:程序上下文和请求上下文。

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

5.2 响应

Flask 调用视图函数后,会将其返回值作为响应的内容。大多数情况下,响应就是一个简
单的字符串,作为 HTML 页面回送客户端。

HTTP 响应中一个很重要的部分是状态码,Flask 默认设为 200,这个代码表明请求已经被成功处理。

如果视图函数返回的响应需要使用不同的状态码,那么可以把数字代码作为第二个返回值,添加到响应文本之后。例如,下述视图函数返回一个 400 状态码,表示请求无效:

@app.route('/')def index():    return '<h1>Bad Request</h1>', 400

视图函数返回的响应还可接受第三个参数,这是一个由首部(header)组成的字典,可以添加到 HTTP 响应中。

如果不想返回由 1 个、2 个或 3 个值组成的元组,Flask 视图函数还可以返回 Response 对
象。 make_response() 函数可接受 1 个、2 个或 3 个参数(和视图函数的返回值一样) ,并
返回一个 Response 对象。下例创建了一个响应对象,然后设置了 cookie:

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

有一种名为重定向的特殊响应类型,重定向经常使用 302 状态码表示,指向的地址由 Location 首部提供。重定向响应可以使用3个值形式的返回值生成,也可在 Response 对象中设定。不过,由于使用频繁,Flask 提供了 redirect() 辅助函数,用于生成这种响应:

from flask import redirect@app.route('/')def index():    return redirect('http://www.example.com')

还有一种特殊的响应由 abort 函数生成,用于处理错误。在下面这个例子中,如果 URL 中
动态参数 id 对应的用户不存在,就返回状态码 404:

from flask import abort@app.route('/user/<id>')def get_user(id):    user = load_user(id)    if not user:        abort(404)    return '<h1>Hello, %s</h1>' % user.name

**注意, abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服
务器。**

0 0
原创粉丝点击