flask-restful 封装接口, ie8/9 下 跨域调用的问题,快被折磨死了。

2017-10-24 22:01:06 +08:00
 xuyl

接口逻辑如下


from flask import Flask, request
from flask_restful import reqparse, abort, Api, Resource
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
api = Api(app)

class Suggest(Resource):
	#decorators = [check_http_headers, check_request_frequency]
	def __init__(self):
		super(SuggestApi, self).__init__()
		self.parser = reqparse.RequestParser()
		self.parser.add_argument('name', type=str, required=True, help='name 不能空')
                self.parser.add_argument('age', type=int, required=True, help='age 不能空')
		self.args = self.parser.parse_args()

	def post(self):
    	       name = self.args['name']
               age = self.args['age']
               return {'name': name, 'age': age}, 200
               #return request.data.decode('utf-8')

api.add_resource(Suggest, '/api/v1/suggest')

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

前端测试页面如下(因为不支持 cors 跨域, 所以用了 xdomain request)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<button>发送 post 请求</button>
	<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
	<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
	<script>
		$(function() {
			$('button').on('click',function() {
				var param = {name:'test', age: 25};
				if(!$.support.cors) {
					param = JSON.stringify(param);
				}

				$.ajax('http://127.0.0.1:5000/api/v1/suggest',{
					type:'post',
					dataType:'json',
					data:param,
					success:function(resp) {
						console.log(resp);
					}
				})
			})
		})
	</script>
</body>
</html>

测试结果

只要用了参数解析reqparse.RequestParser(),并且required=True, 调用接口就是 400 错误;将required=True去掉,虽然不再 400 错误,但并不能在self.args中获取到参数, 测试参数是在request对象里的data属性里面。

求助?

参数解析帮了很大忙,不想因为兼容 ie8 就不用参数解析了,有什么办法能做到让 ie8 兼容呢?

3982 次点击
所在节点    Flask
25 条回复
gstqc
2017-10-24 22:26:39 +08:00
nginx+uwsgi 部署,静态和接口同域就可以了

PS:楼主是 tab 和空格混用的异端……
zhengjian
2017-10-24 22:31:23 +08:00
响应头带上 Access-Control-Allow-Origin
will0404
2017-10-24 22:35:41 +08:00
我的妈 2017 年了还在兼容 IE8
xuyl
2017-10-24 23:30:54 +08:00
@zhengjian 用了 flask_cors 了
xuyl
2017-10-24 23:31:09 +08:00
@will0404 政府项目,没办法
xuyl
2017-10-24 23:32:24 +08:00
@gstqc 不是部署的问题,部署我用 gunicorn,现在就是要在跨域下做调用,能同域名就不会来这里问了。
Kilerd
2017-10-25 00:16:27 +08:00
add_argument 那里添加参数 location,指明从哪里读取数据。
Kilerd
2017-10-25 00:21:10 +08:00
楼上的人包括楼主到底知不知道出现跨域问题是有啥症状?
能出现 400 错,楼上还回复这些东西?

实在看不下去了
meszyouh
2017-10-25 00:48:14 +08:00
开个浏览器吧 , 看下请求 options 请求响应的是啥
hard2reg
2017-10-25 05:21:18 +08:00
@xuyl 政府不用什么 360 安全浏览器的吗?那个好像有 chrome 内核
kaneg
2017-10-25 08:09:36 +08:00
400 bad request, 一般是因为 http 请求的格式不合法,貌似是 http client 的问题
lgh
2017-10-25 08:33:58 +08:00
@Kilerd
@kaneg
真相了……

@xuyl 试试把 self.args = self.parser.parse_args() 移到 post() 方法里去?
winglight2016
2017-10-25 09:52:32 +08:00
400 问题,一般是客户端用了 json 或者 form 提交,服务端却仅支持 url 带参数,这种提交数据格式不规范的错误
可以试一下加入 headers:content-type,另外楼主中断一下服务端看看提交的 request 走到了代码哪个部分?或者把完整的 request 输出一下看看什么问题?
xuyl
2017-10-25 10:55:10 +08:00
@Kilerd location=['form', headers', 'values', 'json', 'data', 'args'] 全试过,都一样的 400 错误
xuyl
2017-10-25 10:55:56 +08:00
@lgh 试过了,不行,依然 400 错误
Kilerd
2017-10-25 11:32:47 +08:00
@xuyl location 写 form,然后 parse_args 放到 post 里面去
bengle
2017-10-25 11:49:04 +08:00
改用 jsonp,是 get 的,只要没有文件上传什么的应该都可以,安全性也差点
xuyl
2017-10-25 15:45:31 +08:00
@bengle 用 jsonp 只是解决跨域问题,现在跨域不是问题,是参数解析的问题
xuyl
2017-10-25 15:48:31 +08:00
@Kilerd 试过,400 错误依旧,我得出的结论就是 ie8 通过 x domain request(xdr)方式兼容 cors 跨域,参数在 request.data 里面,利用 flask-restful 的参数解析是无法获取到参数的,只能硬解 request.data/request.get_data(), 并且这里获取到的还是 binary。
vZexc0m
2017-10-26 09:56:19 +08:00
我是后端解决的。
```
from flask_cors import CORS

cors = CORS()

def create_app(name):
app = Flask(__name__)
app.config.from_object(config[name])
config[name].init_app(app)

cors.init_app(app, supports_credentials=True)
```
你试试能不能行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/400386

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX