Jinja2

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Jinja2 este un motor de șabloane echipat pentru limbajul Python și, prin urmare, cel mai utilizat de Python [1] . Este folosit de cadrele de aplicații web precum Flask . Creat de Armin Ronacher, de asemenea creatorul Flask, și lansat pe 9 iunie 2008 cu versiunea 2.0rc1, este supus continuu actualizărilor și este disponibil sub licența BSD . Proiectul este independent și open source, acceptă pe deplin Unicode și vine cu un sandbox, care este un mediu opțional de execuție a testului integrat.

Jinja2
software
Siglă
Tip Motor șablon (nu este listat )
Dezvoltator Armin Ronacher
Data primei versiuni 9 iunie 2008
Ultima versiune 2.9.6 (3 aprilie 2017)
Sistem de operare Multiplatform
Limba Piton
Licență BSD
( licență gratuită )
Site-ul web palletsprojects.com/p/jinja/

Caracteristici principale

Jinja2 permite crearea de HTML, XML sau alte formate de marcare, care sunt returnate utilizatorului printr-un răspuns HTTP. Versiunile Python pe care poate fi folosit sunt 2.4 și mai recente. Jinja2 nu este singurul motor șablon existent și nici primul care a fost creat. Sintaxa sa este, dimpotrivă, inspirată de Django, a cărei naștere datează din 2003. Spre deosebire de Django, Jinja2 are însă un limbaj expresiv și oferă un set mai puternic de instrumente. Printre inovații se numără cutia cu nisip și sistemul de evacuare automată. În plus, se bazează în întregime pe Unicode.

Jinja2 este utilizat de cadrele de aplicații web precum Flask, Bottle, Morepath și Django și de instrumente precum Ansible, Pelican și altele asemenea. Are o sintaxă consistentă [2] și, pe lângă celelalte motoare șablon, permite pe de o parte să introducă codul în șabloane, pe de altă parte să fie dezvoltat.

  • Cum să fugi în sandbox.
  • Sistem automat de scăpare HTML, pentru a preveni atacurile de tip cross-site scripting (XSS).
  • Moștenirea șablonului: puteți utiliza același aspect sau un aspect similar pentru toate șabloanele.
  • Performanță ridicată pentru compilarea în timp real a codului Python.
  • Ușurința de depanare.
  • Sintaxă configurabilă. De exemplu, poate fi reconfigurat pentru a se potrivi cu ieșirea în formatele LaTeX sau Javascript.
  • O gamă largă de mici ajutoare la îndemână care ajută la rezolvarea sarcinilor obișnuite ale șablonului, cum ar fi împărțirea secvențelor de obiecte în mai multe coloane și multe altele.

Noțiuni de bază

Șablon

În Jinja2, un șablon este un fișier care conține textul unui răspuns. Poate conține variabile și / sau expresii pentru părțile dinamice, care pot fi înlocuite cu valori la momentul redării șablonului și etichete care controlează logica șablonului. Fișierul nu are nevoie de o extensie specifică, poate fi în orice format (HTML, XML, CSV, LaTeX etc.). Jinja2 folosește așa-numitele clase de încărcător pentru a încărca șabloane. Odată ce clasa încărcătorului este inițializată, clasa jinja2.Environment poate fi instanțiată. Această clasă este de bază și este utilizată pentru stocarea variabilelor de configurare, accesarea șabloanelor și trecerea variabilelor la obiectele șablon.

Cel mai simplu mod de a configura Jinja2 și de a încărca șabloane pentru aplicație este acesta:

 din jinja2 import Environment, PackageLoader, select_autoescape
   env = Mediu (
         loader = PackageLoader („aplicația dvs.”, „șablonul”),
         autoescape = select_autoescape (['html', 'xml'])
   ) [3]

Odată ce mediul este creat, șabloanele pot fi încărcate și ieșirea poate fi returnată folosind două metode: get_template și render. Rezultatul obținut poate fi scris într-un fișier. Trebuie să treceți toate variabilele la șablon, ca într-un dicționar: cheile sunt numele variabilelor disponibile în șablon; valorile sunt obiecte Python pe care doriți să le transmiteți șablonului.

Procesul de înlocuire a variabilelor cu valori reale și returnarea șirului de răspuns se numește redare. Componenta dinamică a șablonului Jinja2 este reprezentată de o variabilă închisă între paranteze, astfel: {{ variabilă }}. Pentru a încărca un șablon dintr-un mediu este suficient să apelați metoda get_template () care returnează șablonul încărcat, în timp ce pentru a o returna cu unele variabile, este necesar să apelați metoda render ().

Contextul șablonului conține variabilele unui șablon, adică stochează valorile transmise șablonului și, de asemenea, numele exportate de șablon. Contextul este imuabil din același motiv pentru care cadrele Python locale sunt imuabile în cadrul funcțiilor. Mai mult, Jinja2 nu folosește Context ca un container de date pentru variabile, ci doar ca resurse de date primare, la fel ca Python pentru cadre locale.

Sandbox

Jinja2 Sandbox poate fi utilizat pentru a evalua codurile nesigure, dacă șablonul încearcă să acceseze un cod nesigur, apare un SecurityError. Cu toate acestea, există și câteva excepții pe care sandbox-ul nu le poate controla și este responsabilitatea creatorului codului să se asigure că sunt capturate.

Auto-evadare

Auto-escape este o configurație Jinja2 în care, dacă nu se solicită altfel în mod explicit, orice tipărit într-un șablon este interpretat ca text liber. Să ne imaginăm că valoarea unei variabile x este <b> salut </b>. Dacă este activată auto-escape, {{x}} dintr-un șablon va afișa șirul exact așa cum este dat, adică <b> salut </b>. Dacă este dezactivat, ceea ce este implicit Jinja2, textul rezultat va fi salut .

Când generați HTML din șabloane, variabilele pot include caractere care afectează HTML-ul rezultat. Cele două abordări posibile sunt:

  1. Scăparea manuală a fiecărei variabile
  2. Scăpare automată

Dacă este activată oprirea manuală, este responsabilitatea creatorului de cod să verifice variabilele, folosind filtrul | dacă este necesar și să stabilească asupra variabilelor care trebuie să acționeze:

 {{ variabilă | e}}

În acest fel, valoarea variabilei va fi afișată ca text normal, chiar dacă va conține caractere speciale care altfel ar modifica ieșirea, adică < , > , & sau " .

Cu toate acestea, atunci când este activată evacuarea automată, aceasta se aplică tuturor, cu excepția valorilor marcate explicit ca sigure. Variabilele și expresiile pot fi marcate ca sigure în dicționarul contextual cu MarkupSafe.Markup sau în șablonul cu filtrul | safe.

Moștenirea șablonului

Cea mai puternică parte a Jinja este moștenirea șablonului, care vă permite să construiți un schelet de șablon de bază care să conțină toate elementele comune diferitelor șabloane și să definiți blocuri pe care șabloanele copil le pot moșteni. Șablonul părinte definește apoi un model prin construirea de blocuri etichetate cu blocuri care avertizează motorul șablonului de posibilitatea lor de a fi moștenite de șabloanele copil. Fiecare șablon copil poate umple apoi acele blocuri goale cu conținut folosind eticheta {% extends%} pentru a spune motorului șablonului că șablonul pe care se află eticheta extinde un alt șablon, adică cel părinte. Jinja2 odată întâlnit extinde localizează șablonul părinte corespunzător. Blocurile pot fi cuibărite pentru aspectele mai complexe, dar nu pot exista două blocuri, în același șablon, cu același nume.

API

Jinja2 a fost creat pentru a fi utilizat de cadrele de aplicații web și, din acest motiv, are un API foarte extins. Putem descrie trei tipuri diferite de API:

  1. API-ul de nivel înalt este API-ul utilizat în aplicație pentru încărcarea și returnarea șabloanelor.
  2. API-ul de nivel scăzut este util numai dacă doriți să adânciți în Jinja2 sau să dezvoltați extensii, acesta oferă funcții utile pentru înțelegerea unor detalii de implementare, pentru depanare și pentru tehnici avansate de extensie.
  3. Meta API returnează câteva informații despre arbori de sintaxă abstracte care pot ajuta aplicațiile să implementeze concepte de șabloane mai avansate. Toate funcțiile Meta API funcționează pe un arbore de sintaxă abstract.

Delimitatori

Există diferite tipuri de delimitatori în șablon, cele implicite sunt:

  • {% ...%} pentru instrucțiuni
  • {{...}} pentru expresii și variabile
  • {# ... #} pentru comentarii, neincluse în rezultatul șablonului
  • # ... ## pentru instrucțiuni online

Atunci când este nevoie să scoateți caractere care în mod normal ar fi tratate ca delimitatori, este suficient să le încadrați între ghilimele și apoi să le inserați în delimitatorii folosiți pentru expresii și variabile, adică {{}}:

 {{'{{'}} care returnează {{

Pentru secțiuni mai mari, este logic să înfășurați totul într-un bloc brut:

 {% brut%}
      ...
   {% endraw%}

Variabile

Variabilele șablon sunt definite în dicționarul contextual transmis șablonului și recunoscute de numele atribuite ca chei în dicționar. Construcția {{...}} utilizată în șabloane se referă la o variabilă. Acest substituent special spune motorului șablonului că valoarea care trebuie înlocuită în acea poziție trebuie obținută din datele furnizate în momentul redării șablonului. Jinja2 recunoaște variabile de orice tip, chiar și tipuri complexe, cum ar fi liste, dicționare și obiecte.

Variabilele pot avea atribute sau elemente care pot fi accesate. Puteți utiliza o punctă (.) Pentru a accesa atribute sau, ca în standardul Python, paranteze pătrate []:

 {{foo.bar}}
  {{foo [bar]}}

Dacă o variabilă sau un atribut nu există, rezultatul este o valoare nedefinită. Această valoare, în mod implicit, returnează un șir gol pentru operațiile de tipărire și iterație, în timp ce eșuează pentru orice altă operație.

În Jinja2, numele atribuite ca chei valide trebuie să fie de acord cu expresia regulată [a-Za-z_] [azA-Z0-9] *, valabilă pentru Python 2.x, iar caracterele non-ASCII nu sunt permise.

Filtre

Variabilele pot fi modificate prin filtre, separate de acestea prin simbolul țevii (|), care poate avea opțional argumente între paranteze. Mai multe filtre pot fi înlănțuite și în acest caz ieșirea unui filtru se aplică următorului. Argumentele filtrelor sunt închise între paranteze. Pentru a utiliza un filtru, utilizați doar această structură

 {{ variabilă | filtru }}

Expresia regulată pentru identificatorii de filtru este [a-Za-z_] [azA-Z0-9] * (\. [A-zA-Z _] [a-zA-Z0-9 _] *) * .Jinja2 are un o cantitate imensă de filtre disponibile în mod implicit; cele mai frecvente sunt sigure, cu majuscule, inferioare, superioare, titlu, tăieturi și striptag-uri .

Test

Lângă filtre sunt disponibile „testele”. Acestea pot fi utilizate pentru a testa o variabilă împotriva unei expresii comune. Structura este

 {{ variabila este test }}

Expresia regulată pentru identificatorii de test este [a-Za-z_] [azA-Z0-9] * (\. [A-zA-Z _] [a-zA-Z0-9 _] *) *. acceptați argumente. Dacă testul are un singur argument, nu sunt necesare paranteze.

Controlați construcțiile

O structură de control se referă la tot ceea ce controlează fluxul unui program: instrucțiuni if, pentru bucle, macrocomenzi și blocuri. Cu sintaxa implicită, structurile de control apar în blocurile {% ...%}. Aceste structuri efectuează verificări ale variabilelor, iar rezultatul acestor verificări vă permite să returnați diferite părți ale șablonului.

Dacă afirmație

O declarație condițională, în interiorul unui șablon, creează o cale de decizie. Motorul șablon ia în considerare starea și alege între două sau mai multe blocuri potențiale de cod. Numărul minim de căi posibile este întotdeauna două: una care returnează adevărat dacă condiția este îndeplinită; cealaltă dacă, dimpotrivă, condiția nu este îndeplinită și rezultatul este un bloc gol. Afirmația if din Jinja2 este comparabilă cu cea a Python și, în forma sa cea mai simplă, poate fi utilizată pentru a verifica dacă o variabilă este definită, nu goală și nu falsă, deci ca un control boolean. Spre deosebire de Python, în Jinja2 este obligatorie terminarea declarației cu un endif.

 {% dacă utilizatorii%}
 <ul>
    {% pentru utilizatorii din utilizatori%}
       <li> {{user.username | e}} </li>
    {% endfor%}
 </ul>
 {% endif%} [4]

O instrucțiune if poate fi combinată cu unul sau mai multe elemente opționale, pentru mai multe ramuri și cu o finală opțională else (ca în Python).

 
  {% dacă kenny.sick%}
     Kenny este bolnavă.
  {% elif kenny.dead%}
     L-ai ucis pe Kenny! Nemernicule !!!
  {% else%}
     Kenny pare bine --- până acum
  {% endif%} [4]

Mai mult, poate fi folosit și în expresii inline, ceea ce este util în unele cazuri, adică atunci când nu este de dorit să aveți mai multe linii de cod.

 {% extinde layout_template dacă layout_template este definit altfel 'master.html'%} [5]

Pentru ciclu

Buclează pe fiecare element dintr-o secvență, adică construcția permite crearea dinamică a secțiunilor în șablon și este utilă atunci când este nevoie să operați pe un număr necunoscut de elemente care trebuie tratate în același mod. Instrucțiunea for poate itera peste orice instanță iterabilă și are o sintaxă foarte simplă aproape de Python. De asemenea, permite utilizarea, ca în Python, a altceva, dar cu o semnificație ușor diferită. În Python, blocul else este executat numai dacă nu este precedat de o comandă break. Cu Jinja2, blocul else este executat atunci când for este gol.

 {% pentru i în []%}
     {{i}}
     {% else%} Voi fi tipărit 
  {% endfor%}
  {% pentru i în ['a']%}
     {{i}}
     {% else%} Nu o voi face 
  {% endfor%} [6]

Jinja2 pentru buclă nu acceptă pauză și continuă. Pentru a obține acest comportament, sunt necesare filtre de buclă. De fapt, filtrarea secvenței în timpul iterației vă permite să săriți câteva elemente:

 {pentru i în [1,2,3,4,5] dacă i> 2%}
    valoare: {{i}}; loop.index: {{loop.index}}
  {% - endfor%} [6]

Deoarece variabilele din șabloane păstrează proprietățile obiectelor lor, este posibil să iterați pe containere precum dicționare. În cadrul blocului for, puteți accesa câteva variabile speciale prezentate în următorul tabel [4] :

Variabil Descriere
bucla.index Iterația curentă a buclei, indexată la 1
bucla.index0 Iterația curentă a buclei, indexată la 0
bucla.revindex Numărul de iterații de la sfârșitul buclei, indexat la 1
bucla.revindex0 Numărul de iterații de la sfârșitul buclei, indexat la 0
bucla.în primul rând Returnează adevărat la prima iterație
bucla.last Returnează adevărat la ultima iterație
loop.lenght Numărul de elemente din secvență
bucla.ciclul O funcție de ajutor pentru a parcurge o listă de secvențe
bucla.depth Indică nivelul curent de recursivitate, începând de la nivelul 1
bucla.depth0 Indică nivelul recursiv curent, începând de la nivelul 0

Macro

Macrocomenzile sunt comparabile cu funcțiile limbajelor de programare obișnuite. Jinja2 acceptă macrocomenzi, care sunt similare cu funcțiile Python, iar pentru a le face reutilizabile pot fi stocate în fișiere pentru import. Următorul exemplu arată o macro care returnează un formular:

 {% intrare macro (nume, valoare = "", tip = "text", dimensiune = 20) -%}
       <input type = "{{type}}" name = "{{name}}" value = "{{
        valoare | e}} "size =" {{size}} ">
  {% - endmacro%} [4]

Apoi macro-ul poate fi apelat ca o funcție. Deci, continuând cu exemplul:

 <p> {{input ('password', type = 'password')}}} </p> 

Formularul va avea apoi numele „parolă” și va fi de tip parolă.

Extinde, Blochează, Include

Trei instrucțiuni utile pentru construirea șabloanelor din diferite fișiere sunt: bloc, extinde și include .

Primele două, blocează și extind , funcționează întotdeauna împreună. Primul este folosit pentru a defini blocuri suprascriptibile în șablonul părinte, deci este un substituent și un loc de înlocuit. Al doilea apelează un șablon părinte cu blocuri goale în interiorul șablonului copil care le moștenește. Prin urmare, declară că un șablon derivă din altul, este extins pentru că este moștenitorul altuia.

Declarația include vă permite să returnați un șablon în altul. Prin urmare, este util pentru includerea unui șablon și returnarea conținutului acelui fișier în spațiul de nume curent. Șabloanele incluse au acces în mod implicit la variabilele de context active. Din versiunea 2.2 a Jinja este posibil să marcați o includere cu ignorarea lipsă: în acest caz, dacă șablonul de inclus nu există, este ignorat.

Extensii

Extensiile adaugă filtre, teste și multe altele. Principalul motiv pentru crearea extensiilor este de a crea o bucată de cod ca o clasă reutilizabilă. Extensiile sunt adăugate la mediul Jinja2 la momentul creării printr-o listă de clase de extensii sau prin import. Odată ce mediul a fost creat, extensiile nu pot fi adăugate. Extensiile nu sunt activate în mod implicit, dar ar trebui activate numai atunci când este necesar.

Curiozitate

Numele motorului derivă din cel al unui templu japonez, deoarece cuvintele templu / șablon au o pronunție similară, în timp ce numărul care urmează numelui se referă la ultima versiune pusă la dispoziție [7] .

Filozofie

Logica aplicației este destinată controlerului. Cu toate acestea, scopul nu este să complice prea mult viața designerului, oferind o funcționalitate prea mică. [8]

Notă

  1. ^http://jinja.pocoo.org/
  2. ^ disponibil la http://jinja.pocoo.org/
  3. ^ http://jinja.pocoo.org/docs/2.9/api/#basics
  4. ^ a b c d http://jinja.pocoo.org/docs/2.9/template/#list-of-control-structures [ link rupt ]
  5. ^ http://jinja.pocoo.org/docs/2.9/template/#if-expression [ link rupt ]
  6. ^ a b Italo Maia, Construirea aplicațiilor web cu Flask, 2015, Editura Packt, Birmingham, pp. 134-137
  7. ^ http://jinja.pocoo.org/docs/2.9/faq/
  8. ^ https://pypi.python.org/pypi/Jinja2/2.0

Bibliografie

Surse utilizate pentru scrierea intrării:

  • Italo Maia, Construirea aplicațiilor web cu Flask , Birmingham, Editura Packt, 2015.
  • Miguel Grinberg, Flask Web Development: Developing Web Applications with Python , SUA, O'Reilly Media, Inc., 2014.
  • Rytis Sileika, Pro Python System Administration , Apress, 2014.

Elemente conexe

linkuri externe