session
服务器端生成session:
- 用户登录成功后,将
user_id
与session_id
的对应关系存一份在服务器(也就是Session数据库):
Session.new(dict(session_id = random_str(), user_id = u.id))
然后在响应头设置cookie:
headers = {'Set-Cookie': 'sid={}'.format(session_id)}
之后用户访问的时候,请求头中也会包含cookie
键值对,从cookie
拿到sid
的值也就是session_id
,然后去服务器数据库查session_id
,如果找到了就通过对应的user_id
返回user
;如果没有,就说明没登录;
![](https://img.haomeiwen.com/i7998142/889b3678fe2bdba3.png)
flask浏览器生成session:
- 存一对信息在浏览器内,浏览器和我们共享一个secret_key,是一个对称密钥,用这个对称密钥去加密和解密。对称密钥需要自己制定。
@api_user.route('/login', methods = ['POST'])
def route_login():
form = request.form
u = User(form)
if u.validate_login():
u = User.find_by(username=u.username)
# session_id = random_str()
# s = Session.new(dict(
# session_id=session_id,
# user_id=u.id,
# ))
# log('session', s)
# 1
# headers = {
# 'Set-Cookie': 'sid={}'.format(session_id)
# }
# # 登录后定向到 /
# return redirect('/', headers)
# 2
# # 登录后定向到 /
# redirect_to_index = redirect('/')
# response = make_response(redirect_to_index)
# response.set_cookie('sid', value=session_id)
# return response
# 3
session['user_id'] = u.id
return redirect('/')
else:
return redirect('/login')
from flask import session
def current_user():
# session_id = request.cookies.get('sid', '')
# sessions = Session.all()
# for s in sessions:
# if s.session_id == session_id:
# u = User.find_by(id=s.user_id)
# return u
user_id = session.get('user_id', None)
if user_id is not None:
user_id = int(user_id)
u = User.find_by(id=user_id)
return u
else:
return None
// 自己设定加密方式
app.secret_key = 'dvndifvbduvdjfn'
flask
在浏览器生成的session
,请求头/响应头直接存的是用户id
的键值对,不过对这个键值对进行整体加密。服务器可以直接拿到这个id找到对应的用户。
难道每登录一次就会设置一个随机字符串吗?在session有效期间内都是一样的,失效了之后,再次登录,会重新生成一个随机字符串,session是有有效期的
url_for
url_for('Bluepoint.viewer')
git隐私管理
在代码中可能会有隐私或密码,不易公开上传,可以这样:
- 在
server.py
新建secret.py
文件 - 在
server.py
中import secret
- app.secret_key = 'dvndifvbduvdjfn'
+ app.secret_key = secret.flask_key
- 新建文件:
gitignore
,添加secret.py
到里面即可;
如果不上传git,可以通过filezilla手动创建:
- 拉代码
- 拷贝敏感信息
- 启动服务(supervisor)
错误处理:
将知乎404代码抄过来,.html放在templates里面,其他文件放入static里面,注意将templates里面应用static文件的路径改掉。
在server.py定义函数:
@app.errorhandler(404)
def error_404(e):
return render_template('zhihu404.html'), 404
装饰器可以截取404错误,然后根据自定义返回,return后面有两个参数,一个是返回内容,一个是染回的状态码(可以任意指定,比如200);
裸露代码处理
![](https://img.haomeiwen.com/i7998142/c5732f67bbde1179.png)
这部分代码裸露在外的作用有两个:
- app.run()需要调用
- wsgi.py里面需要调用:application = server.app
现在定义函数,将其包裹,并返回app:
![](https://img.haomeiwen.com/i7998142/d2c9ff08d4a86afb.png)
两个调用做如下改动即可:
![](https://img.haomeiwen.com/i7998142/4144e8bbbbf67d9d.png)
![](https://img.haomeiwen.com/i7998142/aa438d5dae44ee82.png)
那么处理错误的函数怎么处理呢:
![](https://img.haomeiwen.com/i7998142/22ae239c084a14b7.png)
这样可以把视图函数上面的装饰器也去掉:
![](https://img.haomeiwen.com/i7998142/db6a18c649a05e18.png)
讲一下装饰器:
装饰器就是一个函数,它下面的函数就是他的参数,@的作用就是不用写后面的参数;
注意:
函数当做参数被传递的时候,不需要()和里面的参数;
网友评论