Flask(二)

Session

Flask除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。

  • 设置:session[‘username’] = ‘xxx’
  • 删除:session.pop(‘username’, None)

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)


@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
return 'You are not logged in'


@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action="" method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''


@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))


# set the secret key. keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

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

第三方session(我喜欢用这种类型)

这里使用Redis类型,首先在虚拟环境安装两个包,分别是pip install redispip install flask-session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Flask, session, redirect
from flask_session import Session
from redis import Redis

app = Flask(__name__)
app.debug = True
# 这里可以任意填写一个字符串,我这里是采用base64.b64encode(os.urandom(48))
app.secret_key = 'ix4En7l1Hau10aPq8kv8tuzcVl1s2Zo6eA+5+R+CXor8G3Jo0IJvcj001jz3XuXl'


app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host='127.0.0.1', port='6379')
Session(app)


@app.route('/login')
def login():
session['username'] = 'gavinliu'
return redirect('/index')


@app.route('/index')
def index():
name = session['username']
return name


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

蓝图

什么是蓝图

在Flask项目中可以用Blueprint(蓝图)实现模块化的应用,使用蓝图可以让应用层次更清晰,开发者更容易去维护和开发项目。蓝图将作用于相同的URL前缀的请求地址,将具有相同前缀的请求都放在一个模块中,这样查找问题,一看路由就很快的可以找到对应的视图,并解决问题了。

使用蓝图

安装
1
pip install flask_blueprint
实例化蓝图
1
blue = Blueprint('first',__name__)

注意:Blueprint中传入了两个参数,第一个是蓝图的名称,第二个是蓝图所在的包或模块,__name__代表当前模块名或者包名

注册蓝图
1
2
3
app = Flask(__name__)

app.register_blueprint(blue, url_prefix='/user')

注意:注意:第一个参数即我们定义初始化定义的蓝图对象,第二个参数url_prefix表示该蓝图下,所有的url请求必须以/user开始。这样对一个模块的url可以很好的进行统一管理

使用蓝图
1
2
3
4
@blue.route('/', methods=['GET', 'POST'], endpoint='index')
def hello():
# 视图函数
return 'Hello World'

注意:这时候访问应该是127.0.0.1:5000/user/

url_for反向解析
1
url_for(endpoint, 参数名=value)  # 如果在路由上没有配置endpoint,第一个参数可以传递"蓝图中定义的第一个参数.函数名"
1
2
3
4
5
from flask import url_for, redirect

@blue.route('/redirect/')
def make_redirect():
return redirect(url_for('index'))

请求扩展(装饰器实现)

  • @app.before_request
  • @app.after_request
  • @app.errorhandler # 状态码错误信息
  • @app.before_first_request # 请求来只执行第一次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from flask import Flask

app = Flask(__name__)
app.debug = True


@app.before_request
def process_request1(*args, **kwargs):
print('process_request1进来了')


@app.before_request
def process_request2(*args, **kwargs):
print('process_request2进来了')


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


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


@app.before_first_request
def first(*args, **kwargs):
print('first')


@app.errorhandler(404)
def error_404(arg):
return '404错误了'


# 可自定义模板
@app.template_global()
def sb(a1, a2):
return a1 + a2


# 调用方式:{{sb(1,2)}}
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3


# 调用方式:{{ 1|db(2,3)}}
@app.route('/')
def index():
print('index函数')
return 'Hello World!'


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

这个执行流程类似django中间件,可以参考django中间件

中间件

其实Flask也有中间件,Django中也有中间件,但是Flask中的请求扩展就相当于Django中的中间件,而Django中的中间件却不相当于Flask中的中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask

app = Flask(__name__)


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


class Md(object):
def __init__(self, old_wsgi_app):
self.old_wsgi_app = old_wsgi_app

def __call__(self, environ, start_response):
print('开始之前')
ret = self.old_wsgi_app(environ, start_response)
print('结束之后')
return ret


if __name__ == '__main__':
app.wsgi_app = Md(app.wsgi_app)
app.run()
-------------本文结束感谢您的阅读-------------

本文标题:Flask(二)

文章作者:GavinLiu

发布时间:2018年04月09日 - 23:04

最后更新:2018年04月09日 - 23:04

原始链接:http://gavinliu4011.github.io/post/dc6a7e6c.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请博主吃个鸡腿吧
0%