1. 程式人生 > >Flask restful API如何解決跨站請求問題

Flask restful API如何解決跨站請求問題

inb requested api super() AC quest string ret per

如果像下面這樣只是在return的response添加header是不行的:

response = make_response(jsonify(response=get_articles(ARTICLES_NAME)))

response.headers[‘Access-Control-Allow-Origin‘] = ‘*‘

response.headers[‘Access-Control-Allow-Methods‘] = ‘POST‘

response.headers[‘Access-Control-Allow-Headers‘] = ‘x-requested-with,content-type‘

return response

原因是因為發送請求前都會有一個OPTIONS請求,OPTIONS是客戶端瀏覽器進行的HTTP跨域預訪問,而OPTIONS請求時Flask會自動的返回Response,原生的Response並沒有處理跨站請求問題,所以即使在API中的Response添加了header也是不行的。

那麽解決辦法就是: Customizing the Flask Response Class

class MyResponse(Response):
def __init__(self, response=None, **kwargs):
kwargs[‘headers‘] = ‘‘
headers = kwargs.get(‘headers‘)
# 跨域控制
origin = (‘Access-Control-Allow-Origin‘, ‘*‘)
header = (‘Access-Control-Allow-Headers‘, ‘Content-Type‘)
methods = (‘Access-Control-Allow-Methods‘, ‘HEAD, OPTIONS, GET, POST, DELETE, PUT‘)
if headers:
headers.add(*origin)
headers.add(*header)
headers.add(*methods)
else:
headers = Headers([origin, header, methods])
kwargs[‘headers‘] = headers
return super().__init__(response, **kwargs)
需要註意的是這裏的header = (‘Access-Control-Allow-Headers‘, ‘Content-Type‘)
如果沒加這一行,很可能會出現只發送了OPTIONS請求,成功後卻沒有發送GET/POST等請求
這裏的值根據前端請求的header內容的,如果前端的header中還有authorization,那麽這裏得把authorization也加上
header = (‘Access-Control-Allow-Headers‘, ‘Authorization, Content-Type‘)
最後在調用該類
  app = Flask(__name__)   app.response_class = MyResponse

Flask restful API如何解決跨站請求問題