21 Stimmen

Flask Blaupausen richtige Verwendung

Ich habe eine Frage zu Blueprints. Ich habe eine App, die wie folgt aufgebaut ist

app
    /run.py
    /APP
        /__init__.py
        /VIEWS
            /__init__.py
            /general.py
            /crud.py

Dies ist der Code 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)

Die Sache ist, ich scheine eine Menge Zeug in eine Menge Zeug zu importieren. Im Moment funktioniert es. Wenn ich auf die Indexseite gehe, die von general.py Blueprint behandelt wird und mit normal_permission gesichert ist, leitet es auf /login um, das von crud.py Blueprint behandelt wird und wenn es eingeloggt ist, leitet es auf index um. Wieder, im Moment ist es ... funktioniert, aber ... es fühlt sich auch realllllllllly schmutzig und unsauber und .. bleac ... so im Gegensatz zu einigen der guten Code, den ich gelesen :)

Alle Vorschläge sind willkommen. Wenn dies nicht der richtige Weg ist, bin ich bereit zu lernen. Ich möchte nicht, dass einige Code, der .. nur funktioniert haben.

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen und vielleicht zu beantworten.

ps. wenn ich hier zu viel Code eingefügt habe, lassen Sie es mich wissen, und ich werde es heraus bearbeiten.

21voto

mdeous Punkte 16513

Um von den Ansichten Ihres Blueprints auf die aktuelle Anwendung zuzugreifen, sollten Sie die flask.current_app Objekt ist es ein Proxy für die aktuelle Anwendung (und wird z.B. in Flask-Erweiterungen verwendet).

Bezüglich Ihres Codes, abgesehen von den unbenutzten Importen, ist er meiner Meinung nach gut organisiert, aber ich kann nicht sagen, über die principal Teil, da ich ihn nie benutzt habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X