我正在使用Flask构建一个RESTful应用程序,它将使用会话来跟踪登录用户。这是我从此Flask tutorial
改编的登录代码@mod.route('/login/', methods=['GET', 'POST'])
def login():
user = User.query.filter_by(email=request.json['email']).first()
# we use werkzeug to validate user's password
if user and check_password_hash(user.password, request.json['password']):
# the session can't be modified as it's signed,
# it's a safe place to store the user id
session['user_id'] = user.id
resp = jsonify({'status':'authenticated'})
else:
resp = jsonify({'status':'Invalid usernam/password'})
resp.status_code = 401
return resp
当用户首次登录时,我将他们的用户ID存储在会话中,这样当同一个用户请求资源时,数据就会为他们量身定制:
@mod.route('/address/')
@requires_login
def user_data():
user = User.query.filter_by(id=session['usr_id']).first
resp = jsonify(user.address)
return resp
如果我在登录后发出此命令:
curl http://localhost:5000/address/
我收到:
{"status": 401, "message": "Unauthorized"}
而不是我登录用户的地址信息。 谁能告诉我如何在后续的curl调用中使用会话来返回特定于存储在cookie中的用户ID的数据?
答案 0 :(得分:6)
对您的登录请求的响应将包含Set-Cookie
标题,如下所示:
Set-Cookie:session=<encoded session>; Path=/; HttpOnly
您需要使用curl请求发送该cookie,以便会话数据可供处理,您可以使用-H
添加额外的标头以卷曲请求,或明确指定Cookie:
curl --cookie "session=<encoded session>" http://localhost:5000/address/
浏览器当然会为你处理这个问题,但curl完全是无状态的,默认情况下不会为你解析和存储Set-Cookie
标题,不过如果你使用curl执行登录,你可以告诉它将Cookie存储在-c <file>
的Cookie jar中,然后您可以在-b file