Flask RESTFUL,从端点创建cookie(restful.Resource)

时间:2017-02-09 05:49:49

标签: python rest cookies backend endpoint

我目前正致力于从端点创建Cookie。因为我的后端和前端只通过RESTful端点进行交互,所以当前端调用后端的端点时,我是否可以创建一个cookie?

flask.make_response.set_cookie()似乎对我不起作用。此外,我也无法使用app.route('/')设置我的Cookie。

3 个答案:

答案 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