APIFlask跨域POST文件上传卡在OPTIONS预检请求问题求助
问题描述
我在使用APIFlask开发时遇到跨域文件上传异常:我的应用需要向同一主机不同Docker容器中的关联应用发起跨域请求,其中一项功能是上传单个约7MB的.zip文件及其他表单字段到服务器。
已为所有关联应用配置CORS,GET请求可正常执行,但携带文件的POST上传请求卡在OPTIONS预检阶段(控制台显示返回200状态码),后续未触发实际的POST请求;如果不携带.zip文件,请求可正常执行(仅返回表单验证错误)。
当前开发环境下CORS允许所有源访问,API密钥加载正常,不存在授权失败问题。
Flask路由代码
CORS(islets_api) ##adds CORS to this blueprint @islets_api.route('/', methods=["POST", "OPTIONS"]) @login_required def add_islet(): """ Add islet data to db """ form_data = request.form.to_dict() files = request.files if('experiment_name' not in form_data and 'description' not in form_data and 'sampling' not in form_data and 'protocol' not in form_data and 'cell_num' not in form_data): return {"message": "Missing input data. Check form.", "status": "error"}, 400 if 'islet_data' not in files: return {"message": "Missing islet data (.zip). Check form.", "status": "error"}, 400 folder_name = uuid.uuid4().hex folder_path = os.path.join(current_app.config.get('APP_BASE_PATH'), current_app.config.get('ISLET_DATA_FOLDER'), folder_name) os.makedirs(folder_path) ext = files['islet_data'].filename.split('.')[-1] filename = 'islet_data.' + ext file_path = os.path.join(folder_path, filename) files['islet_data'].save(file_path) islet = Islet(folder = folder_name, **form_data) db.session.add(islet) db.session.commit() return { 'message': 'Islet uploaded successfully.', 'status': 'success' }, 200
Axios请求代码
getConfigs(){ const api_key = member.api_key ? member.api_key : '' return { headers: { "Authorization": `Bearer ${api_key}`, "Content-Type": "multipart/form-data" } } } uploadIslet(){ const configs = this.getConfigs() const data = this.getFormData() this.startLoader() window.scrollTo(0, 0); axios.post(this.url, data, configs) .then(function(response){ setMessage(response.data.message, this.alerts[response.data.status], this.messageContainer); window.scrollTo(0, 0); if(response.data.status=='success'){ window.location.hash = 'islander-all-islets' } else{ this.generateComponent() } }.bind(this)).catch(function(error){ this.errorHandling(error, 'Something went wrong.') this.generateComponent() }.bind(this)) }
内容的提问来源于stack exchange,提问作者Marko Šterk
相关产品推荐
相关产品推荐

