第二章 程序的基本结构
2.1 初始化
索引的 Flask 程序都必须创建一个程序实例,经常使用下述代码创建:
from flask import Flask
app = Flask(__name__)
Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python 的 __name__
变量就是所需的值。
2.2 路由和视图函数
-
路由定义:处理 URL 和函数之间的关系的程序称之为路由。
-
最简便的路由声明():
@app.rute('/') def index(): return '<1>Hello</h1>'
@app.rute('/')
:修饰器,参数匹配的是域名。index()
:像这样的函数称之为视图函数,视图函数返回的响应的是页面显示的部分。app.route修饰器,把修饰的函数
index()
注册为路由,这样参数接收特定的 URL 与 修饰的视图函数直接就有了映射的关系。
然而,一般的域名并不是静态的而是可变的,只需在 route 修饰器中使用特殊的语法即可。
下例定义的路由中就有一部分是动态的域名:
@app.rute('/user/name') def index(): return '<1>Hello</h1>'
2.3 启动服务
使用 run 方法启动
if __name__ == '__main__':
app.run(debug=True)
app.run()
函数的参数接收用于设置 Web 服务器的操作模式,要想启用调试模式,可以把 debug 设为 True。
2.4 一个完整的程序
hello.py
from flask import Flask
# 1.初始化 Flask 对象
app = Flask(__name__)
# 2. 设置路由和视图函数
@app.route('/')
def index():
return '<h1>Hello World!<h1>'
@app.route('/user/<name>')
def user(name):
return '<h1>Hello,%s!<h1>' % name
# 3.启动服务
if __name__ == '__main__':
app.run(debug=True)
虚拟环境在激活的状态下执行。
2.5 请求 — 响应循环
2.5.1 程序与上下文
Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。
要让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入给视图函数,但是这样会导致程序中的每个视图函数都增加一个参数,为了避免大量的参数把视图函数弄的一团糟,Flask 使用上下文临时把某些对象变为全局可访问。
from flask import request
@app route('/')
def index():
user_agent = request.headers.get('User-Agent')
return '</p>Your bbrowser is %s</p>' % user_agent
注意在这个函数中我们如何把 request 当做全局变量使用,事实上,request 不可能成为全局变量(每个请求都不一样)。Flask 使用上下文让特定的变量在一个线程中全局可以访问,于此同时却不会干扰其他线程。
2.5.2 响应
-
重定向
这种响应没有页面文档,只告诉浏览器一个新地址用以加载新页面,常用 302 状态码表示,Flask 提供 redirect() 辅助函数,生成这种响应。
from flask import redirect @app.route('/') def index(): return redirect('http://baidu.com')
-
abort 函数
用于处理错误,抛出异常。
from flask import abort @app.route('/user/<id>') def get_user(id): user = load_user(id) if not user: abort(404) reutrn '<h1>Hello,&s</h1>' % user.name
注意,abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服务器。abort()函数就是我们在程序添加了这个方法了之后,如果程序发生了异常,这个程序将会中断异常的程序。
第二章就到这里了,最近状态有点不好特别浮躁,我会尽快调整,每天多看多记录。
码字不易,给个👍呗。
网友评论