Python 获得&引用;找不到服务器上找不到请求的URL;当Flask app server与应用程序所需的其他文件一起放置在文件夹中时
对于我正在制作的程序,我需要能够向本地服务器发送POST请求,以便控制游戏。我用烧瓶来运行这一切 app.py包含用于设置服务器和接收请求的Flask代码。当app.py在任何文件夹之外,只是在我的桌面上时,它就可以正常工作。在文件夹(其组织结构如下所示)中时,页面不工作,并给出404错误。当我转到localhost地址时,它告诉我找不到URL 下面我将更详细地概述这个问题。我包括文件夹组织、在终端和服务器中收到的错误、如何运行代码以及在每个文件中编写的代码。我不确定是什么导致了这个问题Python 获得&引用;找不到服务器上找不到请求的URL;当Flask app server与应用程序所需的其他文件一起放置在文件夹中时,python,flask,server,http-status-code-404,Python,Flask,Server,Http Status Code 404,对于我正在制作的程序,我需要能够向本地服务器发送POST请求,以便控制游戏。我用烧瓶来运行这一切 app.py包含用于设置服务器和接收请求的Flask代码。当app.py在任何文件夹之外,只是在我的桌面上时,它就可以正常工作。在文件夹(其组织结构如下所示)中时,页面不工作,并给出404错误。当我转到localhost地址时,它告诉我找不到URL 下面我将更详细地概述这个问题。我包括文件夹组织、在终端和服务器中收到的错误、如何运行代码以及在每个文件中编写的代码。我不确定是什么导致了这个问题 我的文
- 导出FLASK_APP=game.py
- 烧瓶运行
- game.py
- \uuuu init\uuuuu.py
- app.py
从烧瓶导入烧瓶,请求
app=烧瓶(_u名称)#创建烧瓶app
@app.route('/',方法=['POST','GET'])
def form():
如果request.method==“POST”:
concentrated=request.form.get('concentrated')
返回“人是集中的吗?”?{}''。格式(浓缩)
返回“”'
集中
'''
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
运行(调试=True,端口=5000)
我看了这个问题,但它似乎对我的情况没有帮助:在app/\uuu init\uuuuuuuuuuuuuuuuupy中:
from flask import Flask
app = Flask(__name__)
from .app import *
from flask import Flask, request
from app import app
@app.route('/', methods=['POST','GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
在app.py的中:
from flask import Flask
app = Flask(__name__)
from .app import *
from flask import Flask, request
from app import app
@app.route('/', methods=['POST','GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
在应用程序/\uuuuu init\uuuuuuuuuu.py中:
from flask import Flask
app = Flask(__name__)
from .app import *
from flask import Flask, request
from app import app
@app.route('/', methods=['POST','GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
在app.py的中:
from flask import Flask
app = Flask(__name__)
from .app import *
from flask import Flask, request
from app import app
@app.route('/', methods=['POST','GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
看起来已经解决了您的问题,但我想解释原始问题的原因,并提供我自己的解决方案,该解决方案不使用import*
(请参阅和,上面写着“通配符导入(from import*)应避免使用
,因为它们使名称空间中存在的名称不清楚,从而使读者和许多自动化工具都感到困惑。”)
问题
鉴于此:
game
├── app
│ ├── __init__.py # instantiates app = Flask(__name__)
│ └── app.py # also instantiates app = Flask(__name__)
└── game.py
这里的app
文件夹被视为一个包,因为\uuuu init\uuuuu.py
文件(请参阅Python文档的一节)。\uuuu init\uuuuu.py
可以是空的,但如果您在其中放入一些初始化代码(如应用程序
烧瓶实例的实例化),Python导入应用程序
包时将使用它
您可以通过侵入Flask配置并添加“whoami”
属性来尝试:
app/\uuuuu init\uuuuuuu.py
app = Flask(__name__)
app.config.update({"whoami": "In app/__init__.py"})
app = Flask(__name__)
app.config.update({"whoami": "In app/app.py"})
# rest of your code
from app import app
print(app.config["whoami"])
app/app.py
app = Flask(__name__)
app.config.update({"whoami": "In app/__init__.py"})
app = Flask(__name__)
app.config.update({"whoami": "In app/app.py"})
# rest of your code
from app import app
print(app.config["whoami"])
game.py
app = Flask(__name__)
app.config.update({"whoami": "In app/__init__.py"})
app = Flask(__name__)
app.config.update({"whoami": "In app/app.py"})
# rest of your code
from app import app
print(app.config["whoami"])
跑步
(从游戏文件夹中运行)
game$export\u APP=game.py
游戏$flask运行
*服务烧瓶应用程序“game.py”
...
在app/_init__.py中
*继续http://127.0.0.1:5000/ (按CTRL+C退出)
请注意,导入的app
是来自\uuuu init\uuuu.py
的,它不包含方法表单
,该表单应定义/
URL的路由。这就是为什么当您尝试访问http://127.0.0.1:5000/
,Flask将引发一个错误,即未找到请求的URL(/
)
这种行为类似于所谓的“阴影”,即中的应用程序
隐藏应用程序
中的应用程序
。实际上,这里从未使用app.py
中的app
解决方案
同样,只需将\uuuu init\uuuu.py
文件保持为空即可。它的主要用途(对于您的情况)只是告诉Python,app
文件夹实际上是一个包,以允许从app import app
导入类似的
app/init.py
# leave this empty
from flask import Flask, request
app = Flask(__name__) #create the Flask app
app.config.update({"whoami": "In app/app.py"})
@app.route('/', methods=['POST', 'GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
elif request.method == 'GET':
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
if __name__ == '__main__':
app.run(debug=True, port=5000)
from app.app import app
print(app.config["whoami"])
app/app.py
# leave this empty
from flask import Flask, request
app = Flask(__name__) #create the Flask app
app.config.update({"whoami": "In app/app.py"})
@app.route('/', methods=['POST', 'GET'])
def form():
if request.method == 'POST':
concentrated = request.form.get('concentrated')
return '''The person is concentrated? {}'''.format(concentrated)
elif request.method == 'GET':
return '''<form method="POST">
Concentrated <input type="text" name="concentrated">
<input type="submit">
</form>'''
if __name__ == '__main__':
app.run(debug=True, port=5000)
from app.app import app
print(app.config["whoami"])
跑步
(从游戏文件夹中运行)
game$export\u APP=game.py
游戏$flask运行
*服务烧瓶应用程序“game.py”
...
应用内/app.py
*继续http://127.0.0.1:5000/ (按CTRL+C退出)
127.0.0.1--[28/Dec/2019 09:23:05]“GET/HTTP/1.1”200-
注意这里的四件事
app/\uuuuu init\uuuuu.py
现在为空
game.py
中的导入语句已更改。现在的内容是“从应用程序包的应用程序模块导入应用程序实例”。app文件夹是“app-package”,app.py文件是“app-module”,app=Flask(\uuuu-name\uuuu)
是“app-instance”。这是Python中导入内容的典型方式:从package.module导入内容
。如果你对所有的“应用程序”感到困惑,你可能想重命名其中的一些
“whoami”
属性将显示app
实例是来自app/app.py
的实例,该实例具有实际的路由方法表单
方法中的两个return
语句更改为一个用于GET
请求,另一个用于POST
请求,只是为了明确起见/
URL的工作状态。看起来