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ò.
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
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
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