【问题标题】:Flask RESTFUL, creating a cookie from an endpoint (restful.Resource)烧瓶 RESTFUL,从端点创建 cookie (restful.Resource)
【发布时间】:2017-02-09 05:49:49
【问题描述】:

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

flask.make_response.set_cookie() 似乎对我不起作用。另外,我也不能使用app.route('/') 来设置我的cookie。

【问题讨论】:

    标签: python rest cookies backend endpoint


    【解决方案1】:

    您可以通过 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)
    

    【讨论】:

    • 这个答案有效。请注意,由于某种原因,Chrome Inspector 没有显示此类 cookie,但使用 Flask 的 request.cookies dict 可以找到 cookie。
    • 嗨@hamx0r,你能分享更多关于request.cookie的想法吗?
    【解决方案2】:

    在响应元组中设置标头是标准方法之一。但是请记住,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 调用会设置两者。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 2021-01-14
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多