文章目录

由于写一个登陆界面的时候需要记住上一次的用户名,所以就想到了使用 cookies 。在flask里面的session虽然也是用 cookies 的,但在浏览器关闭的时候不会保存下来。在 flask的文档里面找到相关的说明,里面说如果要用 cookies 就需要新建一个 Response ,然后使用 Response 的 set_cookie 方法去设置 cookies 。尝试自定义了一个Response去写入cookies后发现 Flask-DebugToolbar 这个调试利器居然不能显示了,在网上也找不到相关的资料说明,只好自己去研究一下 Flask-DebugToolbar 的源码。

在 Flask-DebugToolbar 的 __init__.py 文件中提到 self.app.after_request(self.process_response) 说明渲染并替换的工作是在请求后处理的。然后再查看 self.process_response 函数。里面的渲染加了判断,所以我想应该就是这里出了问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (response.status_code == 200
and response.headers['content-type'].startswith('text/html')): # 刚开始以后是这里的问题,后来设成相应的值后还是不行
for panel in self.debug_toolbars[real_request].panels:
panel.process_response(real_request, response)

if response.is_sequence: # 关键在这个地方
response_html = response.data.decode(response.charset)
toolbar_html = self.debug_toolbars[real_request].render_toolbar()

content = replace_insensitive(
response_html, '</body>', toolbar_html + '</body>')
content = content.encode(response.charset)
response.response = [content]
response.content_length = len(content)

上面的 response.is_sequence 是关键,我原先是直接使用 response.response 去设置内容的,这样的情况下 response.is_sequence 的值是False,用 response.data 去设置内容的情况下 response.is_sequence 才是True。最终代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@front.route('/login', methods=['GET', 'POST'])
def login():
"登陆"
response = Response(status=200, content_type='text/html') # 新建一个response对象,用于处理cookies
d = {}
if request.method == 'POST':
response.set_cookie(key='lastlogin', value=request.form.get('username'), max_age=365 * 24 * 60 * 60)
user = db.session.query(User.u_id).filter(User.pswd == request.form.get('password')).\
filter(User.u_id == request.form.get('username')).first()
if user: # 如果用户存在则更新登陆状态
identity_changed.send(current_app._get_current_object(),
identity=Identity(user.u_id))
return redirect(url_for('.index'))
else:
d['errInfo'] = "密码错误!"

d['users'] = db.session.query(User.u_id, User.c_name).all()
d['lastlogin'] = request.cookies.get('lastlogin', None)
response.data = render_template('login.html', **d)
return response

is_sequence 的意思应该是指连续的,想不通的是设置 response 就不算是连续的?

文章目录