为什么NumPy数组的大小会影响Flask中的CORS?

4
发生了一件非常奇怪的事情。
## 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并获取该资源。

为什么ndarray的振幅会影响CORS?这是一个错误吗?可能的原因是什么?我应该怎么解决这个问题?我只想在传输之前缩小图像的尺寸。

另外,我使用SSH本地端口转发将Linux主机上的3413和3412端口转发到我的Windows机器。

顺便说一下,当检测到代码更改时,Flask会重新启动应用程序。但它并不总是可靠的。请在对Python代码进行任何更改时终止Flask应用程序并重新启动它。

版本信息:

Chrome:Version 114.0.5735.199(Official Build)(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)

我对Flask不太熟悉,但CORS的故事都与特定的头部有关,这些头部是在后端特定的中间件中添加的。可能改变数据流程会影响到头部的添加,但这与Vue无关。 - Ali Bahrami
2
也许浏览器是根据发送的字节来推断内容类型的?手动设置内容类型会导致更一致的行为吗? - Nick ODell
你能不能添加一个 https://stackoverflow.com/help/minimal-reproducible-example 的链接? - jub0bs
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接