下面我将详细讲解如何解决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框架来实现这个功能,具体步骤如下:
-
安装flask_cors库
python
pip install flask_cors -
创建一个flask应用。
```python
from flask import Flask, jsonify
from flask_cors import cross_originapp = Flask(name)
``` -
在视图函数中请求外部API。
```python
@app.route('/movies')
@cross_origin()
def get_movies():
import requestsurl = '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装饰器。
-
启动flask应用
python
if __name__ =='__main__':
app.run()
现在我们可以在前端页面通过ajax请求该接口,获取豆瓣电影的数据了。
示例二:在flask中使用vuejs
假如vuejs的应用和flask的应用都在同一服务器上,我们可以通过flask来为vuejs提供后端支持。下面是具体实现步骤:
-
在vuejs项目的src目录下,新建一个config文件夹,然后在config文件夹中新建一个proxy.js文件。
在proxy.js中,我们需要根据flask应用的url,设置代理服务器地址。
javascript
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:5000'
}
}
}
}上述代码中,target表示我们flask应用的地址和端口号。
-
在vuejs的main.js文件中,添加axios的相关配置。
```javascript
import axios from 'axios'axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
Vue.prototype.$http = axios
``` -
在vuejs的组件中,请求flask应用的api接口。
javascript
this.$http.get('/api').then(response => {
console.log(response)
}) -
在flask应用中,添加路由。
```python
from flask import Flask, jsonify
from flask_cors import cross_originapp = 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。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中flask框架跨域问题的解决方法 - Python技术站