Flask学习之程序基本结构

Flask学习之程序基本结构

创建

所有 Flask 程序都必须创建一个程序实例。程序实例是 Flask 类的对象,如下所示创建:

from flask import Flask
app = Flask(name)

Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。一般我们都是使用__name__

路由

处理 URL 和函数之间关系的程序称为路由。
flask框架里面叫Blueprint,定义如下:

蓝本可以自定义路由,但蓝本中定义的路由出于休眠状态,知道蓝本注册到程序上时,路由才真正成为程序的一部分。

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

如route() 装饰器把一个函数绑定到对应的 URL 上。

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'

把 index() 函数注册为程序根地址的处理程序。像 index() 这样的函数称为视图函数( view function)。

动态路由

Facebook 资 料 页 面 的 地 址 是 http://www.facebook.com/< your-name>, 用 户 名( your-name)是地址的一部分。

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

尖括号中的内容就是动态部分,任何能匹配静态部分的 URL都会映射到这个路由上。
路由中的动态部分默认使用字符串,不过也可使用类型定义。例如,路由 /user/< int:id>只会匹配动态片段 id 为整数的 URL。

视图函数

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

index()即为视图函数,你请求根目录时候,flask把请求交给index()函数处理

还可以动态路由

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

上下文

Flask内置一些全局的上下文对象,我们可以通过这些获取很多请求对象的参数

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

例如:

from flask import request

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is % s</p>' % user_agent

我们通过request获取了请求头的信息。关于这些全局的上下文对象,我们有机会再细说吧。先简单了解下这些。

请求钩子

有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。

请求钩子使用修饰器实现。Flask 支持以下 4 种钩子

  • before_first_request :注册一个函数,在处理第一个请求之前运行
  • before_request :注册一个函数,在每次请求之前运行
  • after_request :注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
  • teardown_request :注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行

我们拿我上一篇博客的hello world程序来示范一下:

from flask import Flask, render_template

app = Flask(__name__, template_folder='templates')

@app.before_request
def before_request():
    print 'before_request'

@app.route('/')
def index():
    print 'request index'
    return render_template('hello.html')

@app.after_request
def after_request(response):
    print 'after_request'
    return response

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

然后我们请求http://localhost:5000可以看到后台输出如下内容:

before_request
request index
after_request
127.0.0.1 - - [22/Aug/2018 10:41:35] "GET / HTTP/1.1" 200 -

注意after_request函数里面必须有response参数,并且返回,不然Flask就没有返回请求给客户端了。

我们可以在before_request里面做一些请求之前的数据加载,例如, 可以从数据库中加载已登录用户,并将其保存到 g.user 中。随后调用视图函数时,视图函数再使用 g.user 获取用户。

after_request里面我可以做一些关闭数据库连接,清理数据等的操作。

响应

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

我们也可以自己定义返回对象,使用make_response函数:

from flask import make_response
@app.route('/')
def index():
    response = make_response('<h1>hello world!</h1>')
    response.set_cookie('answer', '42')
    return response

这里我们创建了一个响应对象,然后设置了 cookie。

重定向响应

Flask 提供 redirect() 辅助函数,用于生成这种响应:

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

这样,客户端在请求http://localhost:5000时候,url就会被重定向到http://www.example.com这个页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值