Flask возвращает 404 с менеджером

У меня есть небольшое приложение для отдыха со следующей структурой

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

фрагмент кода из manage.py

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

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. используемый URL - localhost:5000/todo/api/v1.0/tasks.

Я провел последние 3 часа, пытаясь понять, но застрял. Что я делаю не так?


person Abgo80    schedule 17.12.2015    source источник
comment
Я не думаю, что app в manage.py - это ваше приложение, а скорее модуль (из-за последних нескольких строк в __init__.py). Это может быть проблемой, хотя я удивлен, что вы не сталкиваетесь с другими проблемами.   -  person John Szakmeister    schedule 18.12.2015
comment
у вас есть app = Flask(app) в init.py (init.py ?) и app = Flask(name) в app.py. это тоже странно   -  person Gerard Rozsavolgyi    schedule 18.12.2015
comment
приложение в manage.py печатает ‹Flask 'load_gen'›. Он загружен из _init.py. Можете ли вы сказать мне, что еще мне нужно использовать там?   -  person Abgo80    schedule 18.12.2015
comment
@Gerard Rozsavolgyi - я тестировал это. Я изменил его Flask(имя). Будет редактировать код.   -  person Abgo80    schedule 18.12.2015
comment
У вас есть три вещи с именами app. Сначала вы создаете экземпляр Application в __init__.py. Затем вы импортируете модуль с именем app, затеняющий экземпляр. Ваш третий app — это экземпляр внутри app.py. Два экземпляра доставят вам проблемы, особенно когда первый затенен модулем.   -  person dirn    schedule 18.12.2015
comment
@dirn — я изменил app.py на load_app.py. Еще ничего. Я попробовал эту вспомогательную ссылку и получил следующие результаты static HEAD,OPTIONS,GET /static/[filename]. Я считаю, что мой менеджер каким-то образом не регистрирует мое фляжное приложение.   -  person Abgo80    schedule 18.12.2015


Ответы (2)


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. Не определяйте app в load_app.py, и все будет готово, просто удалите импорт в конце __init__.py и измените load_app.py на

from load_gen import app
person dirn    schedule 18.12.2015
comment
Это сделало это. Большое спасибо! Потратил на это слишком много времени. - person Abgo80; 18.12.2015

Ваш 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()

Поскольку объект менеджера создается внутри модуля приложения, и поэтому представления и база данных создаются в правильном контексте.

person Aaron D    schedule 18.12.2015