【问题标题】:Flask blueprints proper usageFlask 蓝图正确使用
【发布时间】:2011-08-16 21:45:33
【问题描述】:

我有一个关于蓝图的问题。我有一个结构像这样的应用程序

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 保护的分页索引,它会重定向到由 crud.py 蓝图处理的 /login,如果登录则重定向到索引。再说一次,现在它......可以工作,但是......它也感觉非常肮脏和不干净而且......

欢迎提出任何建议。如果这不是解决它的方法,我愿意学习。我不想有一些.. 可以工作的代码。

感谢您抽出宝贵时间阅读并回答。

ps。如果我在这里粘贴了太多代码,请告诉我,我会编辑它。

【问题讨论】:

  • 看来你导入的很多东西都没有使用,为什么不在每个模块中只导入你要使用的东西呢? (无论如何,在许多地方导入相同的东西并不是性能问题,因为导入只发生一次,但未使用的导入会使您的代码可读性降低)
  • 我认为你指的是所有那些烧瓶未使用的东西。腼腆和粘贴工作。 Hqvent 清理了任何东西。我更多地讨论了我需要如何从.. 在 crud.py 中导入应用程序,以便通过 identity_changed 更新身份以及更多类似的内容
  • 从另一个模块的视图中访问当前应用程序的正确方法是通过flask.current_app 对象,它是当前应用程序的代理。 (如果这是您要找的东西,请告诉我,我会添加评论作为答案)
  • 这是问题的一部分。您可以将其添加为答案。我更多地看的是我的代码,并告诉我它是否有气味。特别看主要部分。

标签: python flask


【解决方案1】:

要从您的蓝图视图访问当前应用程序,您应该使用 flask.current_app 对象,它是当前应用程序的代理(例如,它在烧瓶扩展中使用)。

关于您的代码,除了未使用的导入,我认为它组织得很好,但我无法说出 principal 部分,因为我从未使用过它。

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多