Flask蓝图正确用法
我有个关于蓝图的问题。我有一个应用程序,结构是这样的:
app
/run.py
/APP
/__init__.py
/VIEWS
/__init__.py
/general.py
/crud.py
这是代码 http://pastebin.com/bsHsTGAP
run.py
from overwatch import app
app.run()
__init__.py
from flask import Flask, session, g, render_template, request, redirect, url_for, Response
import websiteconfig as config
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \
Permission, identity_changed, identity_loaded
app = Flask(__name__)
app.debug = config.DEBUG
app.secret_key = config.SECRET_KEY
principals = Principal(app)
principals._init_app(app)
@app.errorhandler(404)
def not_found(error):
return render_template('404.html'), 404
@app.errorhandler(403)
def page_not_found(e):
session['redirected_from'] = request.url
return redirect(url_for('crud.login'))
# handle login failed
@app.errorhandler(401)
def page_not_found(e):
return Response('<p>Login failed</p>')
from overwatch.views import general
from overwatch.views import crud
app.register_blueprint(general.mod)
app.register_blueprint(crud.mod)
general.py
from flask import Blueprint, render_template, session, redirect, url_for, \
request, flash, g, Response, jsonify
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \
Permission, identity_changed, identity_loaded
from .. import principals
mod = Blueprint('general', __name__)
normal_role = RoleNeed('normal')
normal_permission = Permission(normal_role)
@mod.route('/')
@normal_permission.require(http_exception=403)
def index():
return "YOU'RE IN"
crud.py
from flask import Blueprint, render_template, session, redirect, url_for, \
request, flash, g, Response, jsonify, abort, Response
from mongokit import Connection, Document
from db import user_exists, email_exists, return_attribute, check_credentials
from forms import RegistrationForm, LoginForm
from .. import app
from flaskext.principal import Identity, Principal, RoleNeed, UserNeed, \
Permission, identity_changed, identity_loaded
from general import normal_role, normal_permission
mod = Blueprint('crud', __name__)
@mod.route('/login/', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form)
error = None
if request.method == 'POST' and form.validate():
if check_credentials(form.username.data,form.password.data):
identity = Identity(form.username.data)
identity_changed.send(app, identity=identity)
return redirect(session['redirected_from'])
else:
return abort(401)
return render_template('login.html', form=form, error=error)
@app.route("/logout/")
def logout():
for key in ['identity.name', 'identity.auth_type', 'redirected_from']:
try:
del session[key]
except:
pass
return Response('<p>Logged out</p>')
@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
identity.provides.add(normal_role)
问题是,我似乎在很多地方都导入了很多东西。现在这个程序是能工作的。如果我去访问首页,这个页面是由general.py的蓝图处理的,并且使用了normal_permission进行安全检查,它会重定向到/login,这个页面是由crud.py的蓝图处理的。如果我已经登录,它又会重定向回首页。现在,这一切都能正常运作,但我感觉代码看起来真的很乱,很不干净,和我看到的一些好的代码相比,简直是...呃...太糟糕了 :)
欢迎任何建议。如果这不是解决问题的正确方法,我愿意学习。我不想要一些只是能工作的代码。
感谢你花时间阅读这个问题,也许还能给我一些回答。
附言:如果我在这里粘贴了太多代码,请告诉我,我会删掉一些。
1 个回答
22
要在你的蓝图视图中访问当前的应用程序,你应该使用 flask.current_app
这个对象,它是当前应用程序的一个代理(比如在 Flask 的扩展中就是用这个)。
关于你的代码,除了那些没用到的导入,我觉得整体结构挺好的,不过我对 principal
这部分不太了解,因为我从来没用过它。