2011-08-16 15 views
19

Ho una domanda riguardante i progetti. Ho un app che è strutturato come questoUso corretto delle cianografiche blueprint

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

questo è il codice 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) 

Cosa è, mi sembra di essere l'importazione di un sacco di roba in un sacco di roba. In questo momento funziona. se vado nell'indice di paging, che è gestito da general.py blueprint e protetto con normal_permission, reindirizza a/login che viene gestito dal blueprint di crud.py e se reindirizza ai reindirizzamenti per indicizzare. Ancora, in questo momento ... funziona ma .. sembra anche completamente sporco e impuro e .. bleac ... così diverso dal codice buono che ho letto :)

Qualsiasi suggerimento è benvenuto per favore. Se questo non è il modo di affrontarlo, sono disposto a imparare. Non voglio avere un codice che .. funziona.

Grazie per il vostro tempo a leggere questo e magari a rispondere.

ps. se ho incollato troppo codice qui fammelo sapere e lo modificherò.

+0

sembra che molte delle cose che importi non vengano utilizzate, perché non importi in ciascun modulo solo quello che intendi utilizzare? (comunque, importare le stesse cose in molti posti non è un problema di prestazioni, dato che le importazioni si verificano solo una volta, ma le importazioni inutilizzate rendono il tuo codice meno leggibile) – MatToufoutu

+0

Penso che tu stia facendo riferimento a tutte quelle cose senza pallone. Coy and paste job. Hqvent ha pulito ancora nulla. Mi stavo riferendo di più su come ho bisogno da .. Importa l'app in crud.py per aggiornare l'identità tramite identity_changed e altro su quelle linee – pocorschi

+3

Il modo corretto per accedere all'app corrente da una vista in un altro modulo è attraverso il oggetto 'flask.current_app', che è un proxy per l'applicazione corrente. (se questo è quello che stavi cercando, dimmi e aggiungerò il commento come risposta) – MatToufoutu

risposta

19

Per accedere all'applicazione corrente dalle viste del modello, è necessario utilizzare l'oggetto flask.current_app, è un proxy per l'applicazione corrente (ed è ciò che viene utilizzato nelle estensioni del pallone, ad esempio).

Per quanto riguarda il codice, tranne le importazioni inutilizzate, è ben organizzato a mio parere, ma non posso dire della parte principal, perché non l'ho mai usata.