我目前正致力于从端点创建Cookie。因为我的后端和前端只通过RESTful端点进行交互,所以当前端调用后端的端点时,我是否可以创建一个cookie?
flask.make_response.set_cookie()
似乎对我不起作用。此外,我也无法使用app.route('/')
设置我的Cookie。
答案 0 :(得分:3)
您可以通过回复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)
答案 1 :(得分:3)
在响应元组中设置标头是标准方法之一。但是,请记住,可以多次指定 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调用将同时设置两者。
答案 2 :(得分:0)
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