python - instalar - ¿Cómo seleccionar dinámicamente el directorio de plantillas para usar en el matraz?
estilos en django (3)
Puede pasar el constructor Flask un argumento "template_folder".
Al igual que...
Flask(__name__, template_folder="wherever")
Aquí está la documentación: http://flask.pocoo.org/docs/api/
Por defecto, matraz utiliza archivos de plantilla almacenados en el directorio "plantilla":
/flaskapp
/application.py
/templates
/hello.html
¿Hay alguna manera de elegir dinámicamente el directorio de plantillas de acuerdo con el usuario que inició sesión? Así es como quiero que la estructura del directorio sea:
/flaskapp
/application.py
/templates (default template goes here)
/hello.html
/userdata
/user1
/template1
hello.html
/template2
hello.html
/user2
/template1
hello.html
/template2
hello.html
Ahora bien, si tengo el nombre de usuario de usuario registrado y el nombre de la plantilla activada por el usuario, ¿es posible seleccionar dinámicamente el directorio para cargar archivos de plantilla? Por ejemplo,
/userdata/<username>/<activated template name>/
en lugar de arreglado
/templates/
Lo que intento lograr es un sistema de temas similar a WordPress para mi aplicación web donde los usuarios pueden cargar / seleccionar temas para su sitio web.
Soy nuevo en Python, pero ya me he enfrentado a este problema. No sé si mi solución es correcta, pero funciona:
En primer lugar, debe crear un módulo para cada usuario
/flaskapp
/application.py
/templates (default template goes here)
__init__.py # default module flaskapp
views.py # here you can define methods for default module (like Action in MVC)
/hello.html
/static
/userdata
/user1
__init__.py # user1 module
views.py # here you can define methods for user1 module
/template1
hello.html
/template2
hello.html
/user2
__init__.py # user2 module
views.py # here you can define methods for user2 module
/template1
hello.html
/template2
hello.html
en la aplicación application.py init Flask, agregue el método global render_page_from y registre los planos
app = Flask(__name__)
def render_page_from(controller_name, template_name_or_list, **context):
# here you can choose any controller or use default
app.jinja_loader.searchpath.clear()
blueprint = app.blueprints[controller_name]
app.jinja_loader.searchpath.append(blueprint.template_folder)
return render_template(template_name_or_list, context=context)
from flaskapp.user1 import controller as user1_controller
from flaskapp.user2 import controller as user2_controller
app.register_blueprint(user1_controller)
app.register_blueprint(user2_controller)
en cada módulo (usuario1, usuario2, etc.) plan de inicio en init .py
templates_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), ''templates'')
controller = Blueprint(''user1'', __name__, url_prefix=''/user1'', template_folder = templates_folder)
import flaskapp.user1.views
finalmente agregue métodos de vista (acción) a views.py como este
from LocalHub.client import controller
@controller.route(''/hello'')
def hello():
"""Renders the page"""
return render_page_from(controller.name, ''hello.html'', title=''hello'')
También existe la posibilidad de sobrescribir el cargador Jinja y establecer las rutas donde Jinja buscará las plantillas. Me gusta:
my_loader = jinja2.ChoiceLoader([
app.jinja_loader,
jinja2.FileSystemLoader([''/flaskapp/userdata'',
''/flaskapp/templates'']),
])
app.jinja_loader = my_loader
Los directorios se organizan en el orden en que Jinja necesita comenzar a buscarlo. Luego, desde la vista puede renderizar una plantilla específica para el usuario como esta:
render_template(''%s/template1/hello.html'' % username)
donde el nombre de usuario puede cambiar dinamicamente en la vista. Por supuesto, también puede elegir qué plantilla (1 o 2) representar. Pero básicamente lo que realmente extrañas es este cargador personalizado de Jinja con las rutas personalizadas.
Espero que haya ayudado o dado las ideas :)