Python 获得&引用;找不到服务器上找不到请求的URL;当Flask app server与应用程序所需的其他文件一起放置在文件夹中时

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 下面我将更详细地概述这个问题。我包括文件夹组织、在终端和服务器中收到的错误、如何运行代码以及在每个文件中编写的代码。我不确定是什么导致了这个问题 我的文

对于我正在制作的程序,我需要能够向本地服务器发送POST请求,以便控制游戏。我用烧瓶来运行这一切

app.py包含用于设置服务器和接收请求的Flask代码。当app.py在任何文件夹之外,只是在我的桌面上时,它就可以正常工作。在文件夹(其组织结构如下所示)中时,页面不工作,并给出404错误。当我转到localhost地址时,它告诉我找不到URL

下面我将更详细地概述这个问题。我包括文件夹组织、在终端和服务器中收到的错误、如何运行代码以及在每个文件中编写的代码。我不确定是什么导致了这个问题

  • 我的文件组织如下:
  • 在终端中运行程序时,我将cd放入应用程序文件夹,并在命令行中输入以下命令:

    • 导出FLASK_APP=game.py
    • 烧瓶运行
  • 这是当我转到app.py应该创建的本地主机时,终端中打印的内容。我用黑体字表示它不存在:

  • 在localhost网页上,我发现以下错误:

    “未找到服务器上未找到请求的URL。如果 手动输入URL请检查拼写并重试。“

  • 文件内容:

    • 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的工作状态。

    看起来