Sono ancora nuovo in Flask, quindi potrebbe esserci un modo ovvio per farlo, ma non sono stato in grado di capirlo così lontano dalla documentazione. La mia app è divisa in diverse parti per lo più disparate che condividono cose come utenti/sessioni/sicurezza e modello base e tutto, ma per lo più non interagiscono molto, e dovrebbero essere instradati in percorsi diversi come /part1/...
. Penso che questo sia esattamente ciò che i progetti sono per. Ma cosa succede se ho bisogno di raggruppare percorsi e logica ulteriormente sotto un progetto?Cianografie annidate in una fiaschetta?
Ad esempio, ho blueprint1
con url_prefix='/blueprint1'
e forse con questo voglio avere una raccolta di viste che ruotano attorno a un utente che condivide foto e altri utenti che commentano su di loro. Non riesco a pensare ad un modo migliore di farlo che:
# app/blueprints/blueprint1/__init__.py
blueprint1 = Blueprint('blueprint1', __name__, template_folder='blueprint1')
@blueprint1.route('/photos')
def photos_index():
return render_template('photos/index.html')
@blueprint.route('/photos/<int:photo_id>')
def photos_show(photo_id):
photo = get_a_photo_object(photo_id)
return render_template('photos/show.html', photo=photo)
@blueprint.route('/photos', methods=['POST'])
def photos_post():
...
Il problema qui è che tutti i punti di vista relativi alla sezione foto di blueprint1
si trovano presso il "livello superiore", a destra con forse modelli per video o audio o qualsiasi altra cosa (denominata videos_index()
...). C'è un modo per raggrupparli in un modo più gerarchico, come il modo in cui i modelli vanno sotto la sottodirectory 'blueprint1/photos'
? Naturalmente posso mettere tutte le viste delle foto nel proprio modulo per tenerle organizzate separatamente, ma cosa succede se voglio cambiare il percorso genitore 'blueprint1/photos'
a qualcos'altro? Sono sicuro di poter inventare una funzione o un decoratore che raggruppa percorsi correlati sotto lo stesso percorso radice, ma poi devo ancora nominare tutte le funzioni con il prefisso photos_
e farle riferimento come url_for('blueprint1.photos_show')
Sembra che i progetti siano la risposta quando un pallone l'app diventa grande e devi raggruppare e compartimentare parti simili insieme, ma non puoi fare la stessa cosa quando i progetti stessi diventano grandi.
Per riferimento, in Laravel è possibile raggruppare "viste" correlate in una classe Controller
in cui le viste sono metodi. Controllori possono risiedere in domini gerarchici come app\Http\Controllers\Blueprint1\Photocontroller
, percorsi possono essere raggruppati come
Route::group(['prefix' => 'blueprint1'], function() {
Route::group(['prefix' => 'photos'], function() {
Route::get('/', ['as' => 'blueprint.photos.index', 'uses' => '[email protected]']);
Route::post('/', ['as' => 'blueprint.photos.store', 'uses' => '[email protected]']);
Route::get('/{id}', ['as' => 'blueprint.photos.get', 'uses' => '[email protected]'])
->where('id', '[0-9]+');
});
});
e percorsi possono essere ottenuti come action('Blueprint1\[email protected]')
.
Se solo potessi fare un progetto fotografico, quindi basta fare blueprint1.register_blueprint(photos_blueprint, url_prefix='/photos')
o simili, questi problemi sarebbero praticamente risolti. Purtroppo Flask non sembra supportare i progetti di nesting come questo. C'è un modo alternativo per gestire questo problema?
questo metodo non funziona con @ blueprint_name.before_request –