Python中flask框架跨域问题的解决方法

jinhezx1年前PHP936

下面我将详细讲解如何解决Python中flask框架跨域问题。

什么是跨域问题

在web开发中,跨域是指从一个域名的网页去请求另一个域名的资源,例如通过ajax请求api的时候,如果请求url与源不同,那么就出现了跨域。由于同源策略的限制,跨域请求是被禁止的。

解决方案

要解决跨域问题,我们可以使用flask的CORS扩展,在后端代码中进行配置。

CORS(Cross-Origin Resource Sharing)是一种跨域资源共享的机制。通过在后端设置Access-Control-Allow-Origin响应头,服务端就可以允许前端跨域请求了。

在flask中,我们可以通过安装flask_cors库来简单地实现跨域请求。安装flask_cors可以通过pip来进行安装:

pip install flask_cors

只需要在要请求的视图函数或蓝图上加上@cross_origin装饰器即可。

from flask import Flask, jsonify
from flask_cors import cross_origin

app = Flask(__name__)

@app.route('/api')
@cross_origin()
def api():
    data = {'name':'Alice', 'age': '23'}
    return jsonify(data)

if __name__ =='__main__':
    app.run()

我们来分析一下上述代码。首先,我们在跨域请求的视图函数上面加上了@cross_origin()装饰器,表示该视图函数允许跨域请求。在请求该接口时,前端就可以通过ajax请求方式去访问/api端点,获取返回的json数据。

示例

下面提供两个详细的示例说明。

示例一:访问外部API

假设有这样一个需求:从前端的电影列表页面中请求豆瓣电影API,获取电影列表。我们通过flask框架来实现这个功能,具体步骤如下:

  1. 安装flask_cors库

    python
    pip install flask_cors

  2. 创建一个flask应用。

    ```python
    from flask import Flask, jsonify
    from flask_cors import cross_origin

    app = Flask(name)
    ```

  3. 在视图函数中请求外部API。

    ```python
    @app.route('/movies')
    @cross_origin()
    def get_movies():
    import requests

    url = 'https://api.douban.com/v2/movie/top250'
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    res = requests.get(url, headers=headers)
    
    return jsonify(res.json())

    ```

    在get_movies视图函数中,我们使用requests库去请求豆瓣电影API,然后以json格式返回请求的数据。由于涉及到跨域请求,我们需要在该视图函数上加上@cross_origin装饰器。

  4. 启动flask应用

    python
    if __name__ =='__main__':
    app.run()

现在我们可以在前端页面通过ajax请求该接口,获取豆瓣电影的数据了。

示例二:在flask中使用vuejs

假如vuejs的应用和flask的应用都在同一服务器上,我们可以通过flask来为vuejs提供后端支持。下面是具体实现步骤:

  1. 在vuejs项目的src目录下,新建一个config文件夹,然后在config文件夹中新建一个proxy.js文件。

    在proxy.js中,我们需要根据flask应用的url,设置代理服务器地址。

    javascript
    module.exports = {
    devServer: {
    proxy: {
    '/api': {
    target: 'http://localhost:5000'
    }
    }
    }
    }

    上述代码中,target表示我们flask应用的地址和端口号。

  2. 在vuejs的main.js文件中,添加axios的相关配置。

    ```javascript
    import axios from 'axios'

    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

    Vue.prototype.$http = axios
    ```

  3. 在vuejs的组件中,请求flask应用的api接口。

    javascript
    this.$http.get('/api').then(response => {
    console.log(response)
    })

  4. 在flask应用中,添加路由。

    ```python
    from flask import Flask, jsonify
    from flask_cors import cross_origin

    app = Flask(name)

    @app.route('/api')
    @cross_origin()
    def api():
    data = {'name': 'Alice', 'age': '23'}
    return jsonify(data)

    if name =='main':
    app.run()
    ```

    上述代码中,我们为flask应用添加了/api路由,当vuejs组件通过axios请求/api接口时,就会返回一个含有name和age的json数据。

现在,我们查看vuejs组件的控制台,就能看到从flask应用中返回的json数据了。

总结

通过使用flask_cors库,我们可以简单地解决Python中flask框架跨域问题。在视图函数上加上@cross_origin装饰器即可允许跨域请求。同时,我们提供了两个示例,分别说明了如何在flask中请求外部API和如何在flask中使用vuejs。