2011-08-16 10 views
19

Tengo una pregunta con respecto a los planos. Tengo una aplicación que se estructura como estaPlano de matraces uso adecuado

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

este es el código 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 es que parece estar importando un montón de cosas en un montón de cosas. En este momento funciona. si voy al índice paginado, que es manejado por el plan general.py y asegurado con normal_permission, lo redirecciona a/login, que es manejado por crud.py blueprint y, si está registrado, redirecciona al índice. De nuevo, ahora mismo ... funciona pero ... también se siente realllllllly sucio y sucio y ... bleac ... a diferencia de algunos de los buenos códigos que leo :)

Cualquier sugerencia es bienvenida por favor. Si esta no es la forma de abordarlo, estoy dispuesto a aprender. No quiero tener un código que ... simplemente funcione.

Gracias por su tiempo leyendo esto y tal vez respondiéndolo.

ps. si pegué demasiado código aquí, hágamelo saber y lo editaré.

+0

Parece que muchas de las cosas que importa no se utilizan, ¿por qué no importa en cada módulo solo lo que va a utilizar? (De todos modos, importar las mismas cosas en muchos lugares no es un problema de rendimiento, ya que las importaciones solo se producen una vez, pero las importaciones no utilizadas hacen que el código sea menos legible) – MatToufoutu

+0

Creo que estás refiriéndome a todas esas cosas sin frasco. Coy y pegar trabajo. Hqvent ya limpió todo. Remití más sobre cómo debo hacerlo desde ... Importar aplicación en crud.py para actualizar la identidad a través de identity_changed y más a lo largo de esas líneas – pocorschi

+3

La forma correcta de acceder a la aplicación actual desde una vista en otro módulo es a través de la El objeto 'flask.current_app', que es un proxy para la aplicación actual. (si esto es lo que estabas buscando, dime y agregaré el comentario como respuesta) – MatToufoutu

Respuesta

19

Para acceder a la aplicación actual desde las vistas de su plano, debe usar el objeto flask.current_app, es un proxy para la aplicación actual (y es lo que se usa en las extensiones de matraz, por ejemplo).

En cuanto a su código, excepto las importaciones no utilizadas, está bien organizado en mi opinión, pero no puedo hablar sobre la parte principal, ya que nunca lo he usado.

Cuestiones relacionadas