无法从 Flask 后端呈现 create-react-app 样板视图
Unable to render create-react-app boilerplate views from Flask backend
我很难将 create-react-app 单页应用程序集成到我的 Flask 后端。我希望能够像这样从我的前端进行 fetch/axios 调用:axios.get('/getResults') 和 fetch('/getResults')。我尝试过但不限于将 Flask 端口指定为 3000,这与 create-react-app 使用的相同。此外,在 create-react-app 的 "package.json" 文件上使用了代理配置功能,但无济于事。我怀疑我的文件夹结构和 Flask 代码实现可能是造成这种情况的原因。下面是我的文件夹结构和 "app.py" 代码。我将不胜感激。如有必要,我可以提供更多信息。谢谢
项目
-build(包含静态文件夹,index.html...其他元文件)
-node_modules
-public
-src
app.py
package.json
requirements.txt
app.py:
from flask import Flask, Response, request, jsonify, make_response, send_from_directory,render_template
app = Flask(__name__, static_path='/build/static/')
app.debug=True
@app.route('/')
def root():
print('Inside root function')
return app.send_static_file('index.html')
@app.route('/getResults', methods=["GET"])
def results():
print('Inside getResults path')
return app.send_static_file('index.html')
@app.route('/postData', methods=["POST"])
def data_results():
print('Inside postData path')
data = request.get_json
return jsonify(data)
@app.route('/<path:path>')
def send_js(path):
print("inside send_js fxn")
return send_from_directory('./build/static',path)
if __name__ == "__main__":
print("inside main host call")
app.run(host='0.0.0.0', port=3000)
我在 运行 "python app.py" 时遇到的错误是:
在终端上:内部 root 函数
127.0.0.1 - - [12/Jun/2017 09:42:24] "GET / HTTP/1.1" 404 -
在 browser:Not 上找到 - 在服务器上找不到请求的 URL。如果您手动输入 URL,请检查您的拼写并重试。
我觉得你有很多误解。
create-react-app
运行s 在它自己的服务器上的端口 3000 上,如果你尝试 运行 你的烧瓶应用程序在同一台机器上的同一端口上,它会抱怨该端口3000 已在使用中。因此,从这里我们转向另一个问题 - 您的应用程序的结构。
它会是一个独立的前端基于 reactjs 的客户端,api 后端基于 flask,这将是 2 个独立的应用程序,它们通过 HTTP 相互通信吗?在这种情况下,前端和后端通常 运行 在不同的服务器上。
或者将在其模板页面中使用 reactjs 的 flask 应用程序?
您可以通过在您的代码中更改为以下内容来解决当前未找到 URL 的问题:
@app.route('/')
def root():
print('Inside root function')
return render_template('index.html')
还有这个:
template_dir = os.path.abspath('build/templates')
app = Flask(__name__, static_path='/build/static/',
template_folder=template_dir)
因为您的模板文件夹位于 build
目录中。
我遇到了完全相同的问题,我能够通过使用符号链接安抚 Flask 来解决它。
将模板和静态目录路径保留为默认值,并在包含 Flask 主文件的目录中添加这些符号链接
ln -s build/ templates
ln -s build/static static
如果你好奇的话,这是我的具体问题,它只是涉及更多的嵌套目录,但本质上是一样的:
然后您可以使用 Nurzhan 的根配置:
@app.route('/')
def root():
print('Inside root function')
return render_template('index.html')
但您只需要您的应用声明为:app = Flask(__name__)
唯一对我不起作用的是网站图标,我会在弄清楚后更新此答案。
在开发模式下,您需要配置您的 create-react-app package.json
以将 "ajax" 请求转发到 flask 服务器。
这是我的 package.json
的样子:
{
"name": "socialite",
"version": "0.1.0",
"private": true,
"proxy": "http://localhost:8080",
"devDependencies": {
"react-scripts": "1.0.10"
},
"dependencies": {
"react": "^15.6.1",
"react-dom": "^15.6.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}
看到 proxy
字段了吗?这就是魔法发生的地方,用烧瓶服务器地址替换它的值。这样,您就可以利用 CRA 热重载功能。这记录在 create-react-app as "Proxying API Requests in Development"
然后执行 运行 你的应用程序,你去 localhost:3000
或 yarn 为你打开的任何端口。当你在 API 中调用 javascript 通过彩虹到服务器时: fetch('/api/model/')
或者 nodejs 的服务器将转发到烧瓶应用程序。我认为 nodejs 服务器确实会查看 ajax 请求的内容类型字段,以了解它是否应该将请求转发给后端服务器。
我建议您在所有后端路由前加上 /api/v1/
之类的前缀,这样 nginx 配置就整洁且易于编写。
我很难将 create-react-app 单页应用程序集成到我的 Flask 后端。我希望能够像这样从我的前端进行 fetch/axios 调用:axios.get('/getResults') 和 fetch('/getResults')。我尝试过但不限于将 Flask 端口指定为 3000,这与 create-react-app 使用的相同。此外,在 create-react-app 的 "package.json" 文件上使用了代理配置功能,但无济于事。我怀疑我的文件夹结构和 Flask 代码实现可能是造成这种情况的原因。下面是我的文件夹结构和 "app.py" 代码。我将不胜感激。如有必要,我可以提供更多信息。谢谢
项目
-build(包含静态文件夹,index.html...其他元文件)
-node_modules
-public
-src
app.py
package.json
requirements.txt
app.py:
from flask import Flask, Response, request, jsonify, make_response, send_from_directory,render_template
app = Flask(__name__, static_path='/build/static/')
app.debug=True
@app.route('/')
def root():
print('Inside root function')
return app.send_static_file('index.html')
@app.route('/getResults', methods=["GET"])
def results():
print('Inside getResults path')
return app.send_static_file('index.html')
@app.route('/postData', methods=["POST"])
def data_results():
print('Inside postData path')
data = request.get_json
return jsonify(data)
@app.route('/<path:path>')
def send_js(path):
print("inside send_js fxn")
return send_from_directory('./build/static',path)
if __name__ == "__main__":
print("inside main host call")
app.run(host='0.0.0.0', port=3000)
我在 运行 "python app.py" 时遇到的错误是:
在终端上:内部 root 函数
127.0.0.1 - - [12/Jun/2017 09:42:24] "GET / HTTP/1.1" 404 -
在 browser:Not 上找到 - 在服务器上找不到请求的 URL。如果您手动输入 URL,请检查您的拼写并重试。
我觉得你有很多误解。
create-react-app
运行s 在它自己的服务器上的端口 3000 上,如果你尝试 运行 你的烧瓶应用程序在同一台机器上的同一端口上,它会抱怨该端口3000 已在使用中。因此,从这里我们转向另一个问题 - 您的应用程序的结构。
它会是一个独立的前端基于 reactjs 的客户端,api 后端基于 flask,这将是 2 个独立的应用程序,它们通过 HTTP 相互通信吗?在这种情况下,前端和后端通常 运行 在不同的服务器上。
或者将在其模板页面中使用 reactjs 的 flask 应用程序?
您可以通过在您的代码中更改为以下内容来解决当前未找到 URL 的问题:
@app.route('/')
def root():
print('Inside root function')
return render_template('index.html')
还有这个:
template_dir = os.path.abspath('build/templates')
app = Flask(__name__, static_path='/build/static/',
template_folder=template_dir)
因为您的模板文件夹位于 build
目录中。
我遇到了完全相同的问题,我能够通过使用符号链接安抚 Flask 来解决它。
将模板和静态目录路径保留为默认值,并在包含 Flask 主文件的目录中添加这些符号链接
ln -s build/ templates
ln -s build/static static
如果你好奇的话,这是我的具体问题,它只是涉及更多的嵌套目录,但本质上是一样的:
然后您可以使用 Nurzhan 的根配置:
@app.route('/')
def root():
print('Inside root function')
return render_template('index.html')
但您只需要您的应用声明为:app = Flask(__name__)
唯一对我不起作用的是网站图标,我会在弄清楚后更新此答案。
在开发模式下,您需要配置您的 create-react-app package.json
以将 "ajax" 请求转发到 flask 服务器。
这是我的 package.json
的样子:
{
"name": "socialite",
"version": "0.1.0",
"private": true,
"proxy": "http://localhost:8080",
"devDependencies": {
"react-scripts": "1.0.10"
},
"dependencies": {
"react": "^15.6.1",
"react-dom": "^15.6.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
}
看到 proxy
字段了吗?这就是魔法发生的地方,用烧瓶服务器地址替换它的值。这样,您就可以利用 CRA 热重载功能。这记录在 create-react-app as "Proxying API Requests in Development"
然后执行 运行 你的应用程序,你去 localhost:3000
或 yarn 为你打开的任何端口。当你在 API 中调用 javascript 通过彩虹到服务器时: fetch('/api/model/')
或者 nodejs 的服务器将转发到烧瓶应用程序。我认为 nodejs 服务器确实会查看 ajax 请求的内容类型字段,以了解它是否应该将请求转发给后端服务器。
我建议您在所有后端路由前加上 /api/v1/
之类的前缀,这样 nginx 配置就整洁且易于编写。