使用蓝图错误构建Flask

时间:2015-09-05 11:06:36

标签: python heroku flask

我正在尝试将一个小应用程序分解为单元并使用Flask中的Blueprint模式。但是我似乎无法让应用程序运行。

这是我的结构:

\myapp
  login.py
  \upload
    __init__.py
    views.py  

这是login.py:

import sys, os
from flask import Flask, Blueprint, request
from flask import render_template, session
from .upload import views


app = Flask(__name__)
app.register_blueprint(views)

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

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

代表__init__.py

    from flask import Flask
    app.register_blueprint('upload', __name__)

和views.py

from flask import Flask, Blueprint, request, redirect, url_for, render_template
import views

upload = Blueprint('upload', __name__)

@upload.route('/uploaded', methods=['GET', 'POST'])
def upload_file():
    ...

查看heroku上的日志,这是错误:

from .upload import views
2015-09-05T10:59:00.506513+00:00 app[web.1]: ValueError: Attempted relative import in non-package

正确构建我的包裹和蓝图吗?我使用了文档,但我想我在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:2)

您的代码有三个问题:

  • 您在login.py中使用相对导入来包含views,但考虑到文件夹结构以及使用login.py作为起点的事实,它无法在此处运行。只需使用from upload import views代替。
  • __init__.py引用未知变量app。你实际上在这个文件中不需要任何东西,删除所有内容。
  • 您尝试通过app.register_blueprint(views)中的login.py将模块注册为蓝图。这不行,模块不是蓝图。相反,请导入upload模块中定义的views变量,即蓝图:app.register_blueprint(views.upload)

改变它应该让你开始。两个旁注:

  • views.py中的导入可能不在那里:import views。但这应该是无害的。
  • 我几天前回答了有关Flask蓝图的问题,并举例说明了如何使用它们。也许您会发现the answer对您的情况有用(特别是蓝图定义移动到定义蓝图的__init__.py文件的部分)。