【发布时间】:2017-02-09 05:49:49
【问题描述】:
我目前正在从端点创建 Cookie。由于我的后端和前端仅通过 RESTful 端点进行交互,所以当前端调用我的后端端点时,我是否可以创建一个 cookie?
flask.make_response.set_cookie() 似乎对我不起作用。另外,我也不能使用app.route('/') 来设置我的cookie。
【问题讨论】:
标签: python rest cookies backend endpoint
我目前正在从端点创建 Cookie。由于我的后端和前端仅通过 RESTful 端点进行交互,所以当前端调用我的后端端点时,我是否可以创建一个 cookie?
flask.make_response.set_cookie() 似乎对我不起作用。另外,我也不能使用app.route('/') 来设置我的cookie。
【问题讨论】:
标签: python rest cookies backend endpoint
您可以通过 Set-Cookie header 返回响应来执行此操作。
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'task': 'Hello world'}, 200, {'Set-Cookie': 'name=Nicholas'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
【讨论】:
request.cookies dict 可以找到 cookie。
在响应元组中设置标头是标准方法之一。但是请记住,Set-Cookie 标头可以指定多次,这意味着 python 字典不会是在响应中设置 cookie 的最有效方法。
根据烧瓶文档the header object can also be initialized with a list of tuples,在某些情况下可能更方便。
例子:
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__, static_url_path='')
api = Api(app)
class CookieHeaders(Resource):
def get(self):
# Will only set one cookie "age = 23"
return { 'message' : 'Made with dict'}, 200, { 'Set-Cookie':'name=john', 'Set-Cookie':'age=23' }
def post(self):
# Will set both cookies "name = john" and "age = 23"
headers = [ ('Set-Cookie', 'name=john'), ('Set-Cookie', 'age=23') ]
return { 'message' : ' Made with a list of tuples'}, 200, headers
api.add_resource(CookieHeaders, '/')
if __name__ == '__main__':
app.run(debug=True)
GET 调用只会设置 1 个 cookie(由于 python 字典中缺乏多键支持),但 POST 调用会设置两者。
【讨论】:
Flask 有一个 @after_this_request 回调装饰器。 (见:http://flask.pocoo.org/docs/1.0/api/#flask.after_this_request)
这样您就可以在其中设置 cookie
from flask import after_this_request
from flask_restful import Resource
class FooResource(Resource):
def get(self):
@after_this_request
def set_is_bar_cookie(response):
response.set_cookie('is_bar', 'no', max_age=64800, httponly=True)
return response
return {'data': 'foooo'}
甚至
from flask import after_this_request, request
from flask_restful import Resource, abort
class FooResource(Resource):
def get(self):
self._check_is_bar()
return {'data': 'foooo'}
def _check_is_bar(self)
if request.cookies.get('is_bar') == 'yes':
abort(403)
@after_this_request
def set_is_bar_cookie(response):
response.set_cookie('is_bar', 'no', max_age=64800, httponly=True)
return response
【讨论】: