为什么numpy数组的大小会影响 flask 中的CORS?

a8jjtwal  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(151)

一件非常奇怪的事情发生了。

## app.py

from flask import Flask
from flask_cors import CORS
import numpy as np
import nibabel as nib

app = Flask(__name__)
CORS(app)

@app.route("/",methods=["POST"])
def readNifti():
    img = nib.load("../data/test_project/sub-mrmdCrown_Hep3bLuc_11/ses-iv03/anat/sub-mrmdCrown_Hep3bLuc_11_ses-iv03_acq-TurboRARE_run-5_T2w.nii.gz")
    data = img.get_fdata()
    datamin=data.min()
    datamax=data.max()
    data = np.round((data-datamin)/(datamax-datamin)*200).astype(np.uint8).tobytes()
    # return data
    return np.ones((100,123),dtype=np.uint8).tobytes()

app.run(port=3413)
<template>
  <div>
    Hello World
  </div>
</template>

<script setup lang="ts">
import { onMounted } from 'vue';

onMounted(() => {
  fetch("http://localhost:3413", {
    method: "POST"
  })
    .then(res => res.arrayBuffer())
    .then((data) => {
      console.log(data.byteLength);
    })
})
</script>

当然,这很好用。Vue应用程序在端口3412上运行。Flask应用程序在端口3413上运行。
但是,如果我只修改app.py的一行,它就变成了:

@app.route("/",methods=["POST"])
def readNifti():
    img = nib.load("../data/test_project/sub-mrmdCrown_Hep3bLuc_11/ses-iv03/anat/sub-mrmdCrown_Hep3bLuc_11_ses-iv03_acq-TurboRARE_run-5_T2w.nii.gz")
    data = img.get_fdata()
    datamin=data.min()
    datamax=data.max()
    data = np.round((data-datamin)/(datamax-datamin)*200).astype(np.uint8).tobytes()
    return data # this is the only line changed
    return np.ones((100,123),dtype=np.uint8).tobytes()

当然,它仍然工作得很好。然而,如果我只是改变另一条线,它就会失败。

@app.route("/",methods=["POST"])
def readNifti():
    img = nib.load("../data/test_project/sub-mrmdCrown_Hep3bLuc_11/ses-iv03/anat/sub-mrmdCrown_Hep3bLuc_11_ses-iv03_acq-TurboRARE_run-5_T2w.nii.gz")
    data = img.get_fdata()
    datamin=data.min()
    datamax=data.max()
    # the next line: 200 -> 255, only this number is changed
    data = np.round((data-datamin)/(datamax-datamin)*255).astype(np.uint8).tobytes()
    return data
    return np.ones((100,123),dtype=np.uint8).tobytes()

Vue代码永远不会改变。但浏览器说:
CORS策略已阻止从源“http://localhost:3412”获取“http://localhost:3413/”:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果一个不透明的响应满足了你的需求,将请求的模式设置为“no-cors”,以在禁用CORS的情况下获取资源。
为什么阵列的振幅会影响CORS?这是一个bug吗?可能的原因是什么?我能做些什么来解决这个问题?我只是想在传输之前缩小图像的大小。
顺便说一句,我使用SSH本地端口转发将3413和3412从Linux主机转发到我的Windows机器。
顺便说一下,flask在检测到代码中的任何更改时会重新启动应用程序。但它并不总是可靠的。请在每次对python代码进行任何更改时终止flask应用程序并重新启动它。
版本信息:
Chrome:版本114.0.5735.199(正式构建)(64位)

>>> import flask
>>> flask.__version__
'2.2.2'
>>> import flask_cors
>>> flask_cors.__version__
'3.0.10'
>>> import numpy
>>> numpy.__version__
'1.25.0'
>>> import nibabel
>>> nibabel.__version__
'5.1.0'
$ node -v
v16.13.1
$ npm -v
8.1.2
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
ttp71kqs

ttp71kqs1#

我找到原因了。我碰巧看到了杀毒软件(Sophos)的日志,发现http://localhost被阻止了。这可能就是原因
很抱歉,我没有提供一个最小的可重复的例子。我放弃了以前端和后端的形式编写应用程序,并决定重新开始,使其成为桌面软件。
谢谢大家的好意!

相关问题