Python 在 React/Flask 项目中没有被调用(?)

Posted

技术标签:

【中文标题】Python 在 React/Flask 项目中没有被调用(?)【英文标题】:Python not getting called(?) in React/Flask Project 【发布时间】:2020-11-23 01:51:47 【问题描述】:

总结:我正在尝试使用大流行期间手头的工具自学 Flask 和 React。由于缺少用于远程文件的良好 React 编辑器,我受到了阻碍,我怀疑我可能没有看到这样的编辑器向我显示的错误消息,并且我怀疑我试图调用的 python 脚本永远不会被触及。

非常感谢任何帮助,包括如何更好地查看错误消息或可能配置错误的内容。

我有什么:

    Ubuntu 18.04 容器的仅命令行界面。这意味着:没有远程桌面、没有 GUI、没有专门的反应编辑器。我对此无能为力。

    React 服务器在容器端口 3000 上启动并运行,外部世界可以通过此问题的路径前缀和 answer 访问。这意味着,我可以从文本终端命令行运行 react,在另一个窗口中使用 vi 编辑 react 项目文件,从系统外部将浏览器指向它并且它可以工作。

    Flask 服务器在容器端口 3001 上启动并运行(端口 5000 已经在做其他事情)和配置了端口 3001 作为代理的 React 服务器。上帝帮助我,我正在使用DANGEROUSLY_DISABLE_HOST_CHECK 选项来让它工作。没有特别考虑端口前缀或端口转发——这似乎都是容器内部的,所以我不认为任何特殊处理是必要的。

    根据this site 的教程项目。我将在下面包含两个相关的代码文件。

这样的结果是:

在我调用 react 和 flask 服务器的任何一个终端中都没有错误。

网页显示,但不正确:该页面没有显示正确的时间,而是仅显示我预加载到 currentTime 中的任何内容。

我对 python 脚本是否一直在运行高度怀疑:如果我用严重的语法错误破坏 api.py 文件......行为没有变化。如果我用错误破坏 App.js,系统就会死机。如果我用fetch('/garbage').then... 而不是fetch('/time').then... 的特定错误来破坏App.js,仍然没有错误,我觉得非常可疑。

这让我觉得我可能没有看到一些严重的错误或警告消息。

我怀疑这可能是某种类型的 CORS 问题,但 two attempts 在调整该问题的解决方案时失败了。

来自 App.js 的代码:

import React,  useState, useEffect  from 'react';
import logo from './logo.svg';
import './App.css';

function App() 
  const [currentTime, setCurrentTime] = useState(2);

  useEffect(() => 
    fetch('/time').then(res => res.json()).then(data => 
      setCurrentTime(data.time);
    );
  , []);

  return (
    <div className="App">
      <header className="App-header">
        <img src=logo className="App-logo"  />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
        <p>The current time is currentTime.</p>
      </header>
    </div>
  );


export default App;

来自 api.py 的代码(不包括 CORS 尝试):

import time
from flask import Flask

app = Flask(__name__)

@app.route('/time')
def get_current_time():
    return 'time': time.time()

更新:

在this answer 的建议下,我添加了一些控制台日志语句,并查看了 Chrome 中的控制台日志记录。

App.js:11 GET http://<CORRECT_ADDRESS>/time 404 (Not Found)
(anonymous) @ App.js:11
commitHookEffectListMount @ react-dom.development.js:19731
commitPassiveHookEffects @ react-dom.development.js:19769
callCallback @ react-dom.development.js:188
invokeGuardedCallbackDev @ react-dom.development.js:237
invokeGuardedCallback @ react-dom.development.js:292
flushPassiveEffectsImpl @ react-dom.development.js:22853
unstable_runWithPriority @ scheduler.development.js:653
runWithPriority$1 @ react-dom.development.js:11039
flushPassiveEffects @ react-dom.development.js:22820
(anonymous) @ react-dom.development.js:22699
workLoop @ scheduler.development.js:597
flushWork @ scheduler.development.js:552
performWorkUntilDeadline @ scheduler.development.js:164

注1:不包括3001端口,这似乎是错误的。 注2:路径前缀不包括在内,看起来是正确的。

我本来希望这是: App.js:11 GET http://&lt;CORRECT_ADDRESS&gt;:3001/time

如果需要在该调用中包含端口而不是路径前缀,我该如何安排?

Flask 运行在 3001 端口,package.json 的最后一行是:

"proxy": "http://localhost:3001"


进一步更新

现在使用 fetch('http://&lt;CORRECT_ADDRESS&gt;:3001/time') 会产生以下控制台错误:

WebSocket connection to 'ws://<CORRECT_ADDRESS>/sockjs-node' failed: Error during WebSocket handshake: Unexpected response code: 404
The development server has disconnected.
Refresh the page if necessary.
GET http://<CORRECT_ADDRESS>:3001/time net::ERR_CONNECTION_TIMED_OUT
Uncaught (in promise) TypeError: Failed to fetch

因此,现在 GET 似乎格式正确,但由于 WebSockets 调用失败而超时,该调用可能格式正确,也可能格式不正确。

【问题讨论】:

【参考方案1】:

您可能会看到一个无限循环,其中状态没有机会更新。

试试这个:

@app.route('/time')
def get_current_time():
    print( time.time() )
    return 'time': time.time()

/time 获得点击了吗?因为您的useEffect() 代码将在每次状态更改时运行,也就是每次运行时:无限循环。

如果/time 没有被点击,那么你的问题出在那个相对路径上。试试这个:

useEffect(() => 
    console.log('fetching');
    fetch('/time').then(res => res.json()).then(data => 
        console.log('fetched:' + data);
        setCurrentTime(data.time);
    );
  , []);

接下来,检查您的端口。听起来你可能在 3001 上运行 React/Webpack,而在 5000 上运行服务器。

试试这些:

http://localhost:5000/时间

http://localhost:3000/时间

http://localhost:3001/时间

【讨论】:

如何判断它是否获得了点击?我调用 Flask 服务器的终端没有回显这些打印,如果这就是你的意思的话。 是的,这就是我的意思。他们应该在终端打印。见编辑 这是有用的信息,打印语句应该出现在 Flask 终端窗口中。第二次编辑:如果我理解,其目的是将日志语句反映到 React 控制台窗口中?在任何情况下,都没有效果——在任何一个终端(React 或 Flask 服务器)中都没有活动,并且网页中的信息仍然不正确。 哦,等等,我看到了:当我检查源代码并查看控制台时,我看到了第一个('fetching')日志语句,然后是错误而不是第二个。这也是有价值的信息,如果错误没有导致解决方案,我将更新问题以包含它们。 查看编辑后的答案。我认为问题是你在错误的端口上。

以上是关于Python 在 React/Flask 项目中没有被调用(?)的主要内容,如果未能解决你的问题,请参考以下文章

用React, Flask和SocketIO搭建在线聊天室

(sqlite,Flask + React),flask session session.get() 返回 None [重复]

Docker ( React / Flask / Nginx) - Spotify 授权码

React + flask跨域服务及访问

访问了STL的MAP中没有的元素会出现啥情况啊?

Python开发第一篇基础题目二