【问题标题】:python flask 404 not found找不到python烧瓶404
【发布时间】:2019-04-17 03:18:44
【问题描述】:

我是烧瓶开发的新手,无法使用以下应用程序。我希望在 run.py 中声明 Flask 应用程序,并将其导入其他包中,例如下面的 myapp。我这样设计是因为有不止一个独立的应用程序/包。尝试访问 url “.../hello”时出现 404。我哪里错了?谢谢!

项目布局如下:

├── myapp
│   ├── __init__.py
│   └── myapp.py
└── run.py

myapp/__init__.py 包含:

from flask import Flask
my_app = Flask(__name__)
from . import myapp

myapp/myapp.py 包含:

from run import app
@app.route('/hello')
def show_conf2():
    return "Hello, world!"

run.py 包含:

from flask import Flask
from gevent.pywsgi import WSGIServer
import myapp
@app.route('/')
def index():
    return 'Home route.'
app = Flask(__name__)
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

【问题讨论】:

  • 什么是 render_template ?
  • @ThanhNguyenVan 我尝试实现基于 REST 的服务。
  • 在我的例子中,我有一些使用蓝图的路由的 url 前缀,但在进行 api 调用之前我忘了添加它们。在完全沮丧之后意识到这一点。编码让我谦卑。

标签: python flask


【解决方案1】:

您已经声明了Flask 的两个实例,一个在__init__.py 中,另一个在run.py 中。

Flask官方文档在how to breakdown a larger application in multiple modules上有教程。

我已更新您的代码、文件名和文件夹结构。

文件夹结构:

├── application
│   ├── __init__.py
│   └── views.py
├── requirements.txt
└── run_application.py

run_application.py:

from flask import Flask
from gevent.pywsgi import WSGIServer
from application import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

application/__init__.py:

from flask import Flask
app = Flask(__name__)

import application.views

application/views.py:

from application import app

@app.route('/')
def index():
    return 'Home route.'

@app.route('/hello')
def hello():
    return 'Hello World!'

requirements.txt:

Click==7.0
Flask==1.0.2
gevent==1.4.0
greenlet==0.4.15
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.2

运行命令:

python run_application.py

输出

  1. 回家路线http://localhost:5000/

  1. 你好路由http://localhost:5000/hello

更新

根据Flask documentation on Blueprints

Flask 使用蓝图的概念来制作应用程序组件 并支持应用程序内或跨应用程序的常见模式 应用程序。

更新代码方便blueprints

更新的目录结构:

├── application1
│   ├── __init__.py
│   └── routes.py
├── application2
│   ├── __init__.py
│   └── routes.py
├── apps.py
└── requirements.txt

apps.py:

from flask import Flask
from gevent.pywsgi import WSGIServer
from application1.routes import application1_blueprint
from application2.routes import application2_blueprint


app = Flask(__name__)
app.register_blueprint(application1_blueprint)
app.register_blueprint(application2_blueprint)    

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

application1/__init__.py: 空白文件

application1/routes.py

from flask import Blueprint

application1_blueprint = Blueprint('application1', __name__)

@application1_blueprint.route('/app1')
def application1_index():
    return 'Home route for application1'

@application1_blueprint.route('/hello1')
def hello1():
    return 'Hello World from application1!'

application2/__init__.py: 空白文件

application2/routes.py

from flask import Blueprint

application2_blueprint = Blueprint('application2', __name__)

@application2_blueprint.route('/app2')
def application2_index():
    return 'Home route for application2'

@application2_blueprint.route('/hello2')
def hello2():
    return 'Hello World from application2!'

输出:

/app1 路由来自application1

/app2 路由来自application2

【讨论】:

  • 谢谢!在应用程序中,模块是否必须命名为“views.py”?我希望在读取应用程序中使用其他更有意义的名称。
  • 没有。您可以将views.py 更改为任何名称。在这种情况下,将 import application.views 更改为 import application.YOUR_FILENAME。但有一个建议,不要使用相同的文件夹名称和文件名,例如 myappmyapp.py。它经常造成混乱。
  • 非常感谢。我会尽快测试它。所以在第二个文件夹(例如application2)中,我会说“从应用程序导入应用程序”在views.py中创建其他路由?我需要在 init.py 中声明“app = Flask(name)”吗?我最初尝试在 run.py 中定义“应用程序”是为了方便从 run.py 旁边的任意数量的包中导入它。
  • 您能否提供有关如何使第二个包中的网址起作用的建议?这是我遇到的真正挑战。感谢您的帮助,很抱歉一开始就没有把问题说清楚。
  • 更新了使用蓝图的答案。
【解决方案2】:

在您的代码中,我猜您在烧瓶应用程序中执行run.py。在这种情况下,您的应用程序没有定义任何路由规则。只需修改并将您的代码放入单个文件中即可使用

from flask import Flask
from gevent.pywsgi import WSGIServer
#import myapp

app = Flask(__name__)

@app.route('/hello')
def show_conf2():
    return "Hello, world!"

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

【讨论】:

  • 对不起,我应该说清楚。我的项目需要文件布局。在实际应用程序中,我无法将所有内容都放在一个文件中。我上面给出的例子只是为了说明我遇到的问题。
猜你喜欢
  • 2021-01-18
  • 2015-01-22
  • 2022-09-28
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2013-06-17
  • 2016-10-31
相关资源
最近更新 更多