2016-07-06 9 views
2

Ich habe eine Flask-App mit Blaupausen. Jeder Entwurf enthält einige Vorlagen. Wenn ich versuche, die Vorlage index.html aus dem zweiten Entwurf zu rendern, wird stattdessen die Vorlage des ersten Blueprints gerendert. Warum überschreibt blueprint2 die Vorlagen von blueprint1? Wie kann ich die Vorlagen jedes Blueprints rendern?render_template von Flask Blueprint verwendet andere Blaupause Vorlage

app/ 
    __init__.py 
    blueprint1/ 
     __init__.py 
     views.py 
     templates/ 
      index.html 
    blueprint2/ 
     __init__.py 
     views.py 
     templates/ 
      index.html 

blueprint2/__init__.py:

from flask import Blueprint 

bp1 = Blueprint('bp1', __name__, template_folder='templates', url_prefix='/bp1') 

from . import views 

blueprint2/views.py:

from flask import render_template 
from . import bp1 

@bp1.route('/') 
def index(): 
    return render_template('index.html') 

app/__init__.py:

from flask import Flask 
from blueprint1 import bp1 
from blueprint2 import bp2 

application = Flask(__name__) 
application.register_blueprint(bp1) 
application.register_blueprint(bp2) 

Wenn ich den Auftrag die Pläne sind eingetragene ändern, th Die Vorlagen von Blueprint2 überschreiben Blueprint1s.

+0

Sie sollten Ihre '__init __. Py' Dateien posten. – Malcriado415

+0

Danke, jetzt gepostet. – koc

+0

Ich denke, das Problem ist in 'Blueprint ('bp1', ...' Sie sollten den vollen Namen des Verzeichnisses wie in 'Blueprint (' blueprint1 ', ' – EdoPut

Antwort

-1

Ich erinnere mich vage daran, Probleme mit so etwas früh zu haben. Sie haben nicht Ihren gesamten Code veröffentlicht, aber ich habe vier Vorschläge basierend auf dem, was Sie geschrieben haben. Versuchen Sie die erste, testen Sie sie, und wenn es immer noch nicht funktioniert, versuchen Sie die nächsten, aber testen Sie sie unabhängig, um zu sehen, ob sie funktionieren:

Zuerst kann ich Ihre views.py Datei nicht sehen, also seien Sie sicher ist der entsprechenden Entwurf in Ihren views.py Dateien importieren:

from . import bp1 # in blueprint1/views.py 
from . import bp2 # in blueprint2/views.py 

Zweitens müssen Sie möglicherweise die relativen Importanweisungen in __init__.py wie folgt festzusetzen (beachten Sie die Zeit vor dem Unterordner):

from .blueprint1 import blueprint1 as bp1 
from .blueprint2 import blueprint2 as bp2 

Dritter seit y Wenn Sie den Pfad zu Ihren Vorlagen in der render_template-Funktion fest codieren, versuchen Sie, template_folder='templates' aus Ihrer Blueprint-Definition zu entfernen.

Viertens sieht es so aus, als hätten Sie den url_prefix für Ihren Blueprint als "/ bp1" benannt, als Sie ihn registriert haben. Wenn daher der hart codierte Link zu Ihrem Dateisystem noch nicht funktioniert:

render_template('blueprint1/index.html') 

dann auch dies versuchen und sehen, was passiert:

render_template('bp1/index.html') 

Auch hier kann ich nicht Ihren vollständigen Code sehen, aber ich hoffe das hilft.

+0

Blueprint-Präfixe wirken sich nicht auf Vorlagenpfade aus. Das Problem besteht darin, dass sich die Vorlagen auf demselben Pfad befinden. – davidism

+0

Die Ansichten wurden bereits importiert, andernfalls würden 404-Fehler und keine Vorlagenprobleme auftreten. – davidism

+0

Das Entfernen von 'templates =' aus den Blaupausen würde dazu führen, dass die von den Blueprints bereitgestellten Vorlagen nicht mehr zugänglich sind. – davidism

4

Dies funktioniert genauso wie beabsichtigt, obwohl nicht wie erwartet.

Beim Definieren eines Vorlagenordners für einen Blueprint wird der Ordner nur dem Vorlagensuchpfad hinzugefügt. Es tut nicht bedeutet, dass ein Anruf an render_template von einem Blueprint-Ansicht nur diesen Ordner überprüfen wird.

Vorlagen werden zuerst auf der Anwendungsebene gesucht, dann wurden in der Reihenfolge Blaupausen registriert. Dies ist so, dass eine Erweiterung Vorlagen bereitstellen kann, die von einer Anwendung überschrieben werden können.

Die Lösung besteht darin, separate Ordner innerhalb der Vorlagenordner für Vorlagen im Zusammenhang mit bestimmten Blueprints zu verwenden. Es ist immer noch möglich, sie zu überschreiben, aber viel schwieriger, es versehentlich zu tun.

app/ 
    blueprint1/ 
     templates/ 
      blueprint1/ 
       index.html 
    blueprint2/ 
     templates/ 
      blueprint2/ 
       index.html 
render_template('blueprint1/index.html') 

Siehe für weitere Diskussion Flask issue #1361.

+0

Wahrscheinlich könnte funktionieren, ohne einen neuen Ordner 'bp1' zu erstellen und die Vorlagendatei mit einem eindeutigen Namen zu benennen. –

+0

Sicher, wenn du es so willst. Ich denke, Verzeichnisse sind in diesem Fall bessere Namensräume als Dateinamenpräfixe. – davidism

+0

Ja..korrekt .. + 1 um das Problem hier zu erfassen ... Ich habe es total vermisst;) –

Verwandte Themen