【问题标题】:Flask returns 404 with managerFlask 与经理一起返回 404
【发布时间】:2015-12-17 22:51:56
【问题描述】:

我有一个具有以下结构的小型休息应用程序

Basedir
  - manage.py
  - load_gen
    - __init__.py
    - app.py
    - models.py

manage.py 中的代码 sn-p

from load_gen import app, db
from load_gen.models import User
from flask.ext.script import Manager

manager = Manager(app)

if __name__ == '__main__':
    manager.run()

来自 init.py

的代码 sn-p
import os

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
db = SQLAlchemy(app)

from load_gen import models
from load_gen import app

最后是 app.py

from flask import Flask, jsonify, abort,make_response,url_for    
from models import User

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
        'done': False
    }
]
def make_public_task(task):
    new_task = {}
    for field in task:
        if field == 'id':
            new_task['uri'] = url_for('get_task', task_id=task['id'], _external=True)
        else:
            new_task[field] = task[field]
    return new_task

@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': [make_public_task(task) for task in tasks]})

if __name__ == '__main__':
    app.run(debug=True)

当我尝试使用 python manage.py runserver 运行它时,我的应用程序路由未注册并且我不断收到 404 Not Found。 使用的网址 - localhost:5000/todo/api/v1.0/tasks。

我花了 3 个小时试图弄清楚,但被卡住了。我做错了什么?

【问题讨论】:

  • 我不认为manage.py 中的app 是您的应用程序,而是模块(由于__init__.py 中的最后几行)。这可能是问题所在,但我很惊讶您没有遇到其他问题。
  • 你有 app = Flask("app") init.py (init.py ?) 和 app = Flask(name)应用程序.py。也很奇怪
  • manage.py 中的应用程序打印“”。它从 _init.py 加载。你能告诉我我还需要在那里使用什么吗?
  • @Gerard Rozsavolgyi - 我正在测试它。我将其更改为 Flask(name)。将编辑代码。
  • 您有三个名为 app 的东西。首先在__init__.py 中创建一个Application 实例。然后导入一个名为app 的模块,隐藏实例。您的第三个appapp.py 中的实例。这两个实例会给你带来问题,尤其是当第一个被模块遮蔽时。

标签: python flask flask-script


【解决方案1】:

你运行的app和你注册路由的app不一样。

manage.py 你有

from load_gen import app

manager = Manager(app)

app.py(现在是load_app.py)你有

app = Flask(__name__)

@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': [make_public_task(task) for task in tasks]})

您需要在任何地方使用相同的app。不要在load_app.py 中定义app,你应该已经准备好了,只需删除__init__.py 末尾的导入并将load_app.py 更改为有

from load_gen import app

【讨论】:

  • 做到了。太感谢了!在这上面花了太长时间。
【解决方案2】:

您的manage.py 正在以一种奇怪的方式进行设置。我会将其中一些代码放在__init__.py 的末尾。导入模型和视图(在 app.py 中)后,在 init.py 的底部创建管理器:

manager = Manager(app)

if __name__ == '__main__':
    manager.run()

然后在你的 manage.py 中,你所要做的就是:

from load_gen import manager
manager.run()

因为管理器对象是在应用程序模块内创建的,因此在适当的上下文中创建了视图和数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2019-02-13
    相关资源
    最近更新 更多