我正在尝试将一个小应用程序分解为单元并使用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
正确构建我的包裹和蓝图吗?我使用了文档,但我想我在这里遗漏了一些东西。
答案 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
。但这应该是无害的。__init__.py
文件的部分)。