Išsamus Flask šablonų paveldimumo vadovas naudojant Jinja2, apimantis bazinius šablonus, blokų apibrėžimus ir praktinius pavyzdžius efektyviam žiniatinklio kūrimui.
Flask šablonų paveldimumas: Jinja2 šablonų organizavimo įvaldymas
Žiniatinklio kūrime labai svarbu išlaikyti nuoseklų vaizdą ir pojūtį keliuose puslapiuose. Flask, populiarus Python žiniatinklio karkasas, pasitelkia Jinja2, lankstų ir greitą šablonų variklį, kad palengvintų tai per šablonų paveldimumą. Šablonų paveldimumas leidžia apibrėžti bazinį šabloną su bendrais elementais ir tada jį išplėsti kituose šablonuose, skatinant kodo pakartotinį naudojimą ir supaprastinant priežiūrą. Šis straipsnis pateikia išsamų Flask šablonų paveldimumo su Jinja2 vadovą, apimantį jo principus, įgyvendinimą ir geriausią praktiką.
Kas yra šablonų paveldimumas?
Šablonų paveldimumas yra dizaino modelis, leidžiantis sukurti bazinį šabloną, kuriame yra pagrindinė jūsų svetainės struktūra ir išdėstymas. Tada antriniai šablonai gali paveldėti šį bazinį šabloną ir perrašyti konkrečias sekcijas arba 'blokus', kad pritaikytų savo turinį. Šis požiūris sumažina kodo dubliavimą, užtikrina nuoseklumą ir supaprastina atnaujinimus visoje jūsų žiniatinklio aplikacijoje.
Pagalvokite apie tai kaip apie namo planą. Bazinis šablonas yra bendras dizainas, įskaitant pamatą, sienas ir stogą. Kiekvienas atskiras kambarys (antrinis šablonas) paveldi pagrindinę struktūrą, tačiau jį galima pritaikyti naudojant skirtingas grindis, dažus ir baldus.
Šablonų paveldimumo privalumai
- Kodo pakartotinis naudojimas: Venkite pertekliaus kodo apibrėždami bendrus elementus baziniame šablone ir pakartotinai naudodami juos keliuose puslapiuose.
- Nuoseklumas: Užtikrinkite nuoseklų vaizdą ir pojūtį visoje savo svetainėje, išlaikydami vieną bendrų elementų, tokių kaip antraštės, poraštės ir navigacijos meniu, šaltinį.
- Priežiūra: Supaprastinkite atnaujinimus ir modifikacijas atlikdami pakeitimus baziniame šablone, kuris automatiškai bus perkeltas į visus antrinius šablonus.
- Organizavimas: Struktūrizuokite savo šablonus logišku ir hierarchiniu būdu, kad jūsų kodo bazę būtų lengviau suprasti ir valdyti.
- Sutrumpintas kūrimo laikas: Sutaupykite laiko ir pastangų naudodami bazinį šabloną kaip atspirties tašką naujiems puslapiams, o ne kurdami juos nuo nulio.
Pagrindinių sąvokų supratimas
1. Bazinis šablonas
Bazinis šablonas yra jūsų šablonų paveldimumo struktūros pagrindas. Jame yra bendri elementai, kurie bus bendrinami visuose arba daugumoje jūsų svetainės puslapių. Tai paprastai apima HTML struktūrą, CSS stilių lapus, JavaScript failus, antraštę, poraštę ir navigacijos meniu.
Pavyzdys pagrindinio bazinio šablono (base.html
):
{% block title %}Mano svetainė{% endblock %}
Mano svetainė
{% block content %}{% endblock %}
Šiame pavyzdyje apibrėžiame pagrindinę HTML struktūrą su antrašte, navigacijos meniu, pagrindinio turinio sritimi ir porašte. Atkreipkite dėmesį į {% block %}
žymes, kurios apibrėžia sekcijas, kurias galima perrašyti antriniuose šablonuose.
2. Blokų apibrėžimai
Blokai yra vietos rezervavimo ženklai baziniame šablone, kuriuos gali pakeisti arba modifikuoti antriniai šablonai. Jie apibrėžiami naudojant {% block %}
ir {% endblock %}
žymes. Blokai leidžia įterpti konkretų turinį į skirtingas bazinio šablono dalis.
Aukščiau pateiktame base.html
pavyzdyje apibrėžėme du blokus:
title
: Šis blokas apibrėžia HTML dokumento pavadinimą.content
: Šis blokas apibrėžia pagrindinę puslapio turinio sritį.
3. Antriniai šablonai
Antriniai šablonai paveldi bazinį šabloną ir gali perrašyti blokus, apibrėžtus baziniame šablone. Norėdami paveldėti bazinį šabloną, naudokite {% extends %}
žymę antrinio šablono pradžioje.
Pavyzdys antrinio šablono (index.html
), išplečiančio base.html
šabloną:
{% extends 'base.html' %}
{% block title %}Pagrindinis - Mano svetainė{% endblock %}
{% block content %}
Sveiki atvykę į pagrindinį puslapį!
Tai yra pagrindinio puslapio turinys.
{% endblock %}
Šiame pavyzdyje išplečiame base.html
šabloną ir perrašome title
ir content
blokus. title
blokas nustatytas į "Pagrindinis - Mano svetainė", o content
blokas pakeičiamas turiniu, būdingu pagrindiniam puslapiui.
4. Funkcija `super()`
Funkcija super()
leidžia pasiekti bloko, apibrėžto baziniame šablone, turinį iš antrinio šablono. Tai naudinga, kai norite papildyti arba modifikuoti bloko turinį visiškai jo nepakeisdami.
Pavyzdys, kaip naudoti super()
, norint pridėti turinio prie content
bloko:
{% extends 'base.html' %}
{% block content %}
{{ super() }}
Tai yra papildomas turinys, pridėtas prie bazinio šablono turinio bloko.
{% endblock %}
Šiame pavyzdyje funkcija super()
įterpia originalų content
bloko turinį iš base.html
šablono, o tada antrinis šablonas prideda savo turinį po juo.
Šablonų paveldimumo įgyvendinimas Flask
Norėdami naudoti šablonų paveldimumą Flask, turite sutvarkyti savo šablonus logiškoje katalogo struktūroje ir sukonfigūruoti Flask, kad rastų jūsų šablonus.
1. Katalogo struktūra
Įprasta Flask šablonų katalogo struktūra yra tokia:
my_project/
app.py
templates/
base.html
index.html
about.html
contact.html
static/
style.css
script.js
Šioje struktūroje templates
kataloge yra visi HTML šablonai, įskaitant bazinį šabloną ir antrinius šablonus. static
kataloge yra statiniai failai, tokie kaip CSS stilių lapai ir JavaScript failai.
2. Flask konfigūracija
Pagal numatytuosius nustatymus Flask ieško šablonų kataloge, pavadintame templates
, tame pačiame kataloge kaip ir jūsų aplikacija. Tai galite tinkinti nustatydami Flask aplikacijos objekto template_folder
atributą.
Pavyzdys, kaip sukonfigūruoti Flask naudoti pasirinktinį šablonų aplanką:
from flask import Flask, render_template
app = Flask(__name__, template_folder='my_templates')
@app.route('/')
def index():
return render_template('index.html')
3. Šablonų atvaizdavimas
Norėdami atvaizduoti šabloną Flask, naudokite funkciją render_template()
. Ši funkcija kaip argumentą priima šablono failo pavadinimą ir grąžina atvaizduotą HTML eilutę.
Pavyzdys, kaip atvaizduoti index.html
šabloną:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
Atvaizduojant antrinį šabloną, Flask automatiškai įtraukia bazinį šabloną ir pritaiko bloku perrašymus, apibrėžtus antriniame šablone.
Praktiniai pavyzdžiai
1 pavyzdys: Paprastas tinklaraštis
Sukurkime paprastą tinklaraštį su baziniu šablonu ir atskirais šablonais tinklaraščio įrašams.
base.html:
{% block title %}Mano tinklaraštis{% endblock %}
Mano tinklaraštis
{% block content %}{% endblock %}
post.html:
{% extends 'base.html' %}
{% block title %}{{ post.title }} - Mano tinklaraštis{% endblock %}
{% block content %}
{{ post.title }}
Paskelbta: {{ post.date }}
{{ post.content }}
{% endblock %}
Šiame pavyzdyje post.html
šablonas išplečia base.html
šabloną ir perrašo title
ir content
blokus tinklaraščio įrašo pavadinimu, data ir turiniu. Kintamasis post
perduodamas į šabloną iš Flask maršruto.
app.py:
from flask import Flask, render_template
app = Flask(__name__)
posts = [
{
'title': 'Pirmas tinklaraščio įrašas',
'date': '2023-10-27',
'content': 'Tai yra pirmojo tinklaraščio įrašo turinys.'
},
{
'title': 'Antras tinklaraščio įrašas',
'date': '2023-10-28',
'content': 'Tai yra antrojo tinklaraščio įrašo turinys.'
}
]
@app.route('/')
def index():
return render_template('index.html', posts=posts)
@app.route('/post/')
def post(post_id):
post = posts[post_id]
return render_template('post.html', post=post)
2 pavyzdys: Daugiakalbė svetainė
Įsivaizduokite, kad kuriate svetainę, kuri palaiko kelias kalbas. Šablonų paveldimumas gali padėti valdyti skirtingus teksto elementus kiekviename puslapyje. Galite sukurti bazinį šabloną su vietos rezervavimo ženklais išverstam tekstui, o tada sukurti antrinius šablonus kiekvienai kalbai. Pavyzdžiui, tarkime, kad turite bazinį šabloną ir norite palaikyti anglų ir prancūzų kalbas.
base.html:
{% block title %}{% endblock %}
{% block content %}{% endblock %}
index_en.html (angliška versija):
{% extends "base.html" %}
{% block title %}Welcome to My Website{% endblock %}
{% block home_link %}Home{% endblock %}
{% block about_link %}About{% endblock %}
{% block content %}
Welcome!
This is the English version of the homepage.
{% endblock %}
index_fr.html (prancūziška versija):
{% extends "base.html" %}
{% block title %}Bienvenue sur mon site web{% endblock %}
{% block home_link %}Accueil{% endblock %}
{% block about_link %}À propos{% endblock %}
{% block content %}
Bienvenue !
Ceci est la version française de la page d'accueil.
{% endblock %}
Šiame supaprastintame pavyzdyje kiekviena kalbos versija išplečia bazinį šabloną ir pateikia išverstą tekstą pavadinimui, naršymo nuorodoms ir pagrindiniam turiniui. Šis požiūris palengvina skirtingų jūsų svetainės kalbų versijų valdymą.
Geriausia praktika
- Laikykite bazinį šabloną paprastą: Baziniame šablone turėtų būti tik esminiai elementai, kurie yra bendrinami visuose puslapiuose.
- Naudokite aprašomuosius blokų pavadinimus: Pasirinkite blokų pavadinimus, kurie aiškiai nurodo jų paskirtį.
- Tvarkykite šablonus logiškai: Grupuokite susijusius šablonus kartu kataloguose.
- Venkite giliai įdėto paveldimumo: Apribokite paveldimumo hierarchijos gylį, kad išvengtumėte sudėtingumo.
- Naudokite funkciją `super()` apdairiai: Naudokite funkciją
super()
tik tada, kai reikia papildyti arba modifikuoti bloko turinį iš bazinio šablono. - Apsvarstykite galimybę naudoti šablonų komponentus: Sudėtingesnėms svetainėms apsvarstykite galimybę suskaidyti šablonus į mažesnius, pakartotinai naudojamus komponentus. Tai galima pasiekti naudojant įtraukas arba makrokomandas Jinja2, tačiau jos turėtų papildyti, o ne pakeisti gerą paveldimumo strategiją.
Išplėstinės technikos
1. Sąlyginis blokų perrašymas
Šablonuose galite naudoti sąlyginius teiginius, kad sąlygiškai perrašytumėte blokus, atsižvelgdami į tam tikras sąlygas. Tai leidžia tinkinti puslapių turinį pagal vartotojų roles, nuostatas ar kitus veiksnius.
{% extends 'base.html' %}
{% block content %}
{% if user.is_authenticated %}
Sveiki, {{ user.username }}!
Tai yra turinys autentifikuotiems vartotojams.
{% else %}
Sveiki!
Prisijunkite, kad pasiektumėte daugiau turinio.
{% endif %}
{% endblock %}
2. Makrokomandų naudojimas
Jinja2 makrokomandos yra panašios į funkcijas Python. Jos leidžia apibrėžti pakartotinai naudojamus HTML kodo fragmentus, kuriuos galima iškviesti iš šablonų. Makrokomandos gali būti naudojamos šablonų komponentams, tokiems kaip formos elementai, naršymo meniu ir nuotraukų galerijos, kurti.
Pavyzdys, kaip apibrėžti makrokomandą atskirame faile (macros.html
):
{% macro input(name, type='text', value='') %}
{% endmacro %}
Pavyzdys, kaip importuoti ir naudoti makrokomandą šablone:
{% from 'macros.html' import input %}
3. Šablonų filtrai
Šablonų filtrai leidžia modifikuoti kintamųjų išvestį šablonuose. Jinja2 pateikia daugybę įtaisytųjų filtrų, tokių kaip capitalize
, lower
, upper
ir date
. Taip pat galite apibrėžti savo pasirinktinius filtrus.
Pavyzdys, kaip naudoti date
filtrą datai formatuoti:
Paskelbta: {{ post.date | date('%Y-%m-%d') }}
Išvada
Flask šablonų paveldimumas su Jinja2 yra galinga technika šablonams tvarkyti, kodo pakartotiniam naudojimui skatinti ir nuoseklumui užtikrinti visoje jūsų žiniatinklio aplikacijoje. Suprasdami pagrindines bazinių šablonų, blokų apibrėžimų ir antrinių šablonų sąvokas, galite sukurti gerai struktūrizuotus ir prižiūrimus šablonus, kurie supaprastina jūsų žiniatinklio kūrimo darbo eigą. Įgyvendinkite DRY (Nekartok savęs) principą ir pasinaudokite šablonų paveldimumu, kad sukurtumėte patikimas ir keičiamo mastelio žiniatinklio aplikacijas.
Šiame išsamiame vadove aptarti pagrindiniai Flask šablonų paveldimumo aspektai. Laikydamiesi pavyzdžių ir geriausios praktikos, aprašytos šiame straipsnyje, galite efektyviai įgyvendinti šablonų paveldimumą savo Flask projektuose ir sukurti gerai organizuotas, prižiūrimas ir nuoseklias žiniatinklio aplikacijas pasaulinei auditorijai. Nepamirškite pritaikyti šiuos metodus prie konkrečių savo projektų poreikių ir ištirkite išplėstines Jinja2 funkcijas, kad dar labiau patobulintumėte savo šablonų kūrimo galimybes.