Hĺbkový pohľad na Tornado, Python webový framework. Naučte sa tvoriť škálovateľné, výkonné aplikácie s podrobnými príkladmi a osvedčenými postupmi.
Dokumentácia k Tornadu: Komplexný sprievodca pre vývojárov z celého sveta
Tornado je Python webový framework a asynchrónna sieťová knižnica, pôvodne vyvinutá vo FriendFeed. Je obzvlášť vhodný pre long-polling, WebSockets a ďalšie aplikácie, ktoré vyžadujú dlhotrvajúce spojenie s každým používateľom. Jeho neblokujúce sieťové I/O ho robí extrémne škálovateľným a výkonnou voľbou pre vytváranie vysoko výkonných webových aplikácií. Tento komplexný sprievodca vás prevedie základnými konceptmi Tornada a poskytne praktické príklady, aby ste mohli začať.
Čo je Tornado?
Vo svojej podstate je Tornado webový framework a asynchrónna sieťová knižnica. Na rozdiel od tradičných synchrónnych webových frameworkov, Tornado používa architektúru založenú na jedinom vlákne a slučke udalostí. To znamená, že dokáže spracovať mnoho súbežných pripojení bez potreby jedného vlákna na pripojenie, čo ho robí efektívnejším a škálovateľnejším.
Kľúčové vlastnosti Tornada:
- Asynchrónne sieťovanie: Jadro Tornada je postavené na asynchrónnom I/O, čo mu umožňuje efektívne spracovávať tisíce súbežných pripojení.
- Webový framework: Obsahuje funkcie ako obsluha požiadaviek, smerovanie, šablónovanie a autentifikácia, čo z neho robí kompletný webový framework.
- Podpora WebSocketov: Tornado poskytuje vynikajúcu podporu pre WebSockets, čo umožňuje komunikáciu v reálnom čase medzi serverom a klientmi.
- Ľahký a rýchly: Navrhnutý pre výkon, Tornado je ľahký a efektívny, minimalizuje réžiu a maximalizuje priepustnosť.
- Jednoduché použitie: Napriek pokročilým funkciám je Tornado relatívne ľahko naučiteľné a použiteľné, s jasným a dobre zdokumentovaným API.
Nastavenie vášho prostredia pre Tornado
Predtým, ako sa ponoríte do vývoja s Tornadom, musíte si nastaviť svoje prostredie. Tu je podrobný sprievodca:
- Nainštalujte Python: Uistite sa, že máte nainštalovaný Python 3.6 alebo novší. Môžete si ho stiahnuť z oficiálnej webovej stránky Pythonu (python.org).
- Vytvorte virtuálne prostredie (odporúčané): Použite
venv
alebovirtualenv
na vytvorenie izolovaného prostredia pre váš projekt:python3 -m venv myenv source myenv/bin/activate # Na Linux/macOS myenv\Scripts\activate # Na Windowse
- Nainštalujte Tornado: Nainštalujte Tornado pomocou pip:
pip install tornado
Vaša prvá aplikácia v Tornade
Vytvorme jednoduchú "Hello, World!" aplikáciu s Tornadom. Vytvorte súbor s názvom app.py
a pridajte nasledujúci kód:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, World!")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Teraz spustite aplikáciu z vášho terminálu:
python app.py
Otvorte si webový prehliadač a prejdite na http://localhost:8888
. Mali by ste vidieť správu "Hello, World!".
Vysvetlenie:
tornado.ioloop
: Hlavná slučka udalostí, ktorá spracováva asynchrónne operácie.tornado.web
: Poskytuje komponenty webového frameworku, ako sú obsluha požiadaviek a smerovanie.MainHandler
: Obsluha požiadaviek, ktorá definuje, ako spracovať prichádzajúce HTTP požiadavky. Metódaget()
sa volá pre GET požiadavky.tornado.web.Application
: Vytvára aplikáciu Tornado, mapuje vzory URL na obsluhu požiadaviek.app.listen(8888)
: Spustí server, ktorý počúva prichádzajúce spojenia na porte 8888.tornado.ioloop.IOLoop.current().start()
: Spustí slučku udalostí, ktorá spracováva prichádzajúce požiadavky a asynchrónne operácie.
Obsluha požiadaviek a smerovanie (Routing)
Obsluha požiadaviek je základom webových aplikácií v Tornade. Definuje, ako spracovať prichádzajúce HTTP požiadavky na základe URL. Smerovanie mapuje URL na konkrétnu obsluhu požiadaviek.
Definovanie obsluhy požiadaviek:
Na vytvorenie obsluhy požiadaviek vytvorte podtriedu tornado.web.RequestHandler
a implementujte príslušné HTTP metódy (get
, post
, put
, delete
atď.).
class MyHandler(tornado.web.RequestHandler):
def get(self):
self.write("Toto je GET požiadavka.")
def post(self):
data = self.request.body.decode('utf-8')
self.write(f"Prijaté POST dáta: {data}")
Smerovanie:
Smerovanie sa konfiguruje pri vytváraní tornado.web.Application
. Poskytnete zoznam n-tíc, kde každá n-tica obsahuje vzor URL a príslušnú obsluhu požiadaviek.
app = tornado.web.Application([
(r"/", MainHandler),
(r"/myhandler", MyHandler),
])
Vzory URL:
Vzory URL sú regulárne výrazy. Môžete použiť skupiny regulárnych výrazov na zachytenie častí URL a ich odovzdanie ako argumenty metódam obsluhy požiadaviek.
class UserHandler(tornado.web.RequestHandler):
def get(self, user_id):
self.write(f"ID používateľa: {user_id}")
app = tornado.web.Application([
(r"/user/([0-9]+)", UserHandler),
])
V tomto príklade /user/([0-9]+)
zodpovedá URL adresám ako /user/123
. Časť ([0-9]+)
zachytí jednu alebo viac číslic a odovzdá ich ako argument user_id
metóde get
handlera UserHandler
.
Šablónovanie
Tornado obsahuje jednoduchý a efektívny šablónovací systém. Šablóny sa používajú na dynamické generovanie HTML, čím sa oddeľuje prezentačná logika od logiky aplikácie.
Vytváranie šablón:
Šablóny sa zvyčajne ukladajú do samostatných súborov (napr. index.html
). Tu je jednoduchý príklad:
<!DOCTYPE html>
<html>
<head>
<title>Moja webstránka</title>
</head>
<body>
<h1>Vitaj, {{ name }}!</h1>
<p>Dnes je {{ today }}.</p>
</body>
</html>
{{ name }}
a {{ today }}
sú zástupné symboly, ktoré budú pri vykresľovaní šablóny nahradené skutočnými hodnotami.
Vykresľovanie šablón:
Na vykreslenie šablóny použite metódu render()
vo vašej obsluhe požiadaviek:
class TemplateHandler(tornado.web.RequestHandler):
def get(self):
name = "Ján Novák"
today = "2023-10-27"
self.render("index.html", name=name, today=today)
Uistite sa, že nastavenie template_path
je správne nakonfigurované v nastaveniach vašej aplikácie. V predvolenom nastavení Tornado hľadá šablóny v adresári s názvom templates
v tom istom adresári ako súbor vašej aplikácie.
app = tornado.web.Application([
(r"/template", TemplateHandler),
], template_path="templates")
Syntax šablón:
Šablóny v Tornade podporujú rôzne funkcie, vrátane:
- Premenné:
{{ variable }}
- Riadenie toku:
{% if condition %} ... {% else %} ... {% end %}
,{% for item in items %} ... {% end %}
- Funkcie:
{{ function(argument) }}
- Vkladanie (Includes):
{% include "another_template.html" %}
- Escaping: Tornado automaticky escapuje HTML entity, aby sa predišlo útokom typu cross-site scripting (XSS). Escaping môžete vypnúť pomocou
{% raw variable %}
.
Asynchrónne operácie
Sila Tornada spočíva v jeho asynchrónnych schopnostiach. Asynchrónne operácie umožňujú vašej aplikácii vykonávať neblokujúce I/O, čo zlepšuje výkon a škálovateľnosť. To je obzvlášť užitočné pre úlohy, ktoré zahŕňajú čakanie na externé zdroje, ako sú databázové dopyty alebo sieťové požiadavky.
@tornado.gen.coroutine
:
Dekorátor @tornado.gen.coroutine
vám umožňuje písať asynchrónny kód pomocou kľúčového slova yield
. Vďaka tomu asynchrónny kód vyzerá a správa sa viac ako synchrónny kód, čo zlepšuje čitateľnosť a udržiavateľnosť.
import tornado.gen
import tornado.httpclient
class AsyncHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
http_client = tornado.httpclient.AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
self.write(response.body.decode('utf-8'))
V tomto príklade je http_client.fetch()
asynchrónna operácia, ktorá vracia Future
. Kľúčové slovo yield
pozastaví vykonávanie korutiny, kým sa Future
nevyrieši. Akonáhle je Future
vyriešený, korutina pokračuje a telo odpovede sa zapíše klientovi.
tornado.concurrent.Future
:
Future
predstavuje výsledok asynchrónnej operácie, ktorá ešte nemusí byť dostupná. Môžete použiť objekty Future
na reťazenie asynchrónnych operácií a spracovanie chýb.
tornado.ioloop.IOLoop
:
IOLoop
je srdcom asynchrónneho motora Tornada. Monitoruje súborové deskriptory a sokety na udalosti a posiela ich príslušným handlerom. Zvyčajne nemusíte priamo interagovať s IOLoop
, ale je dôležité pochopiť jeho úlohu pri spracovaní asynchrónnych operácií.
WebSockets
Tornado poskytuje vynikajúcu podporu pre WebSockets, čo umožňuje komunikáciu v reálnom čase medzi serverom a klientmi. WebSockets sú ideálne pre aplikácie, ktoré vyžadujú obojsmernú komunikáciu s nízkou latenciou, ako sú chatovacie aplikácie, online hry a real-time dashboardy.
Vytvorenie WebSocket handlera:
Na vytvorenie WebSocket handlera vytvorte podtriedu tornado.websocket.WebSocketHandler
a implementujte nasledujúce metódy:
open()
: Volá sa pri nadviazaní nového WebSocket spojenia.on_message(message)
: Volá sa pri prijatí správy od klienta.on_close()
: Volá sa pri zatvorení WebSocket spojenia.
import tornado.websocket
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket otvorený")
def on_message(self, message):
self.write_message(f"Poslali ste: {message}")
def on_close(self):
print("WebSocket zatvorený")
def check_origin(self, origin):
return True # Povolenie cross-origin WebSocket spojení
Integrácia WebSocketov do vašej aplikácie:
Pridajte WebSocket handler do konfiguračného smerovania vašej aplikácie:
app = tornado.web.Application([
(r"/ws", WebSocketHandler),
])
Implementácia na strane klienta:
Na strane klienta môžete použiť JavaScript na nadviazanie WebSocket spojenia a posielanie/prijímanie správ:
const websocket = new WebSocket("ws://localhost:8888/ws");
websocket.onopen = () => {
console.log("WebSocket spojenie nadviazané");
websocket.send("Ahoj z klienta!");
};
websocket.onmessage = (event) => {
console.log("Prijatá správa:", event.data);
};
websocket.onclose = () => {
console.log("WebSocket spojenie zatvorené");
};
Autentifikácia a bezpečnosť
Bezpečnosť je kritickým aspektom vývoja webových aplikácií. Tornado poskytuje niekoľko funkcií, ktoré vám pomôžu zabezpečiť vaše aplikácie, vrátane autentifikácie, autorizácie a ochrany pred bežnými webovými zraniteľnosťami.
Autentifikácia:
Autentifikácia je proces overovania identity používateľa. Tornado poskytuje vstavanú podporu pre rôzne schémy autentifikácie, vrátane:
- Autentifikácia založená na cookies: Ukladanie prihlasovacích údajov používateľa do cookies.
- Autentifikácia tretích strán (OAuth): Integrácia s populárnymi sociálnymi platformami ako Google, Facebook a Twitter.
- API kľúče: Použitie API kľúčov na autentifikáciu API požiadaviek.
Autorizácia:
Autorizácia je proces určovania, či má používateľ povolenie na prístup k určitému zdroju. Môžete implementovať autorizačnú logiku vo vašich handeroch na obmedzenie prístupu na základe rolí alebo povolení používateľa.
Osvedčené postupy v oblasti bezpečnosti:
- Ochrana proti Cross-Site Scripting (XSS): Tornado automaticky escapuje HTML entity, aby sa predišlo útokom XSS. Vždy používajte metódu
render()
na vykresľovanie šablón a vyhýbajte sa priamemu generovaniu HTML vo vašich handeroch. - Ochrana proti Cross-Site Request Forgery (CSRF): Povoľte ochranu proti CSRF v nastaveniach vašej aplikácie, aby ste predišli útokom CSRF.
- HTTPS: Vždy používajte HTTPS na šifrovanie komunikácie medzi serverom a klientmi.
- Validácia vstupu: Validujte všetky vstupy od používateľov, aby ste predišli útokom typu injection a iným zraniteľnostiam.
- Pravidelné bezpečnostné audity: Vykonávajte pravidelné bezpečnostné audity na identifikáciu a riešenie potenciálnych zraniteľností.
Nasadenie (Deployment)
Nasadenie aplikácie Tornado zahŕňa niekoľko krokov, vrátane konfigurácie webového servera, nastavenia správcu procesov a optimalizácie výkonu.
Webový server:
Môžete nasadiť Tornado za webovým serverom ako Nginx alebo Apache. Webový server funguje ako reverzný proxy, ktorý presmerováva prichádzajúce požiadavky na aplikáciu Tornado.
Správca procesov:
Správca procesov ako Supervisor alebo systemd môže byť použitý na správu procesu Tornado, zabezpečujúc, že sa automaticky reštartuje v prípade pádu.
Optimalizácia výkonu:
- Použite produkčnú slučku udalostí: Použite produkčnú slučku udalostí ako
uvloop
pre lepší výkon. - Povoľte gzip kompresiu: Povoľte gzip kompresiu na zníženie veľkosti HTTP odpovedí.
- Cachujte statické súbory: Cachujte statické súbory na zníženie zaťaženia servera.
- Monitorujte výkon: Monitorujte výkon vašej aplikácie pomocou nástrojov ako New Relic alebo Prometheus.
Internacionalizácia (i18n) a lokalizácia (l10n)
Pri vytváraní aplikácií pre globálne publikum je dôležité zvážiť internacionalizáciu (i18n) a lokalizáciu (l10n). i18n je proces navrhovania aplikácie tak, aby ju bolo možné prispôsobiť rôznym jazykom a regiónom bez technických zmien. l10n je proces prispôsobenia internacionalizovanej aplikácie pre konkrétny jazyk alebo región pridaním lokálnych komponentov a prekladom textu.
Tornado a i18n/l10n
Tornado samo o sebe nemá vstavané knižnice pre i18n/l10n. Avšak, môžete ľahko integrovať štandardné Python knižnice ako `gettext` alebo sofistikovanejšie frameworky ako Babel na spracovanie i18n/l10n vo vašej aplikácii Tornado.
Príklad použitia `gettext`:
1. **Nastavte svoje lokalizácie:** Vytvorte adresáre pre každý jazyk, ktorý chcete podporovať, obsahujúce katalógy správ (zvyčajne súbory `.mo`).
locales/
en/LC_MESSAGES/messages.mo
fr/LC_MESSAGES/messages.mo
de/LC_MESSAGES/messages.mo
2. **Extrahujte preložiteľné reťazce:** Použite nástroj ako `xgettext` na extrahovanie preložiteľných reťazcov z vášho Python kódu do súboru `.po` (Portable Object). Tento súbor bude obsahovať pôvodné reťazce a miesta pre preklady.
xgettext -d messages -o locales/messages.po your_tornado_app.py
3. **Preložte reťazce:** Preložte reťazce v `.po` súboroch pre každý jazyk.
4. **Skompilujte preklady:** Skompilujte `.po` súbory do súborov `.mo` (Machine Object), ktoré používa `gettext` za behu.
msgfmt locales/fr/LC_MESSAGES/messages.po -o locales/fr/LC_MESSAGES/messages.mo
5. **Integrujte do vašej aplikácie Tornado:**
import gettext
import locale
import os
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
def initialize(self):
try:
locale.setlocale(locale.LC_ALL, self.get_user_locale().code)
except locale.Error:
# Spracovanie prípadov, keď lokál nie je podporovaný systémom
print(f"Lokál {self.get_user_locale().code} nie je podporovaný")
translation = gettext.translation('messages', 'locales', languages=[self.get_user_locale().code])
translation.install()
self._ = translation.gettext
def get_current_user_locale(self):
# Logika na určenie lokálu používateľa (napr. z hlavičky Accept-Language, nastavení používateľa atď.)
# Toto je zjednodušený príklad - budete potrebovať robustnejšie riešenie
accept_language = self.request.headers.get('Accept-Language', 'en')
return tornado.locale.get(accept_language.split(',')[0].split(';')[0])
class MainHandler(BaseHandler):
def get(self):
self.render("index.html", _=self._)
settings = {
"template_path": os.path.join(os.path.dirname(__file__), "templates"),
}
app = tornado.web.Application([
(r"/", MainHandler),
], **settings)
6. **Upravte svoje šablóny:** Použite funkciu `_()` (naviazanú na `gettext.gettext`) na označenie reťazcov pre preklad vo vašich šablónach.
<h1>{{ _("Vitajte na našej webstránke!") }}</h1>
<p>{{ _("Toto je preložený odsek.") }}</p>
Dôležité aspekty pre globálne publikum:
- **Kódovanie znakov:** Vždy používajte kódovanie UTF-8 na podporu širokej škály znakov.
- **Formátovanie dátumu a času:** Používajte formátovanie dátumu a času špecifické pre daný lokál. S nastaveniami lokálu je možné použiť funkcie Pythonu `strftime` a `strptime`.
- **Formátovanie čísel:** Používajte formátovanie čísel špecifické pre daný lokál (napr. desatinné oddeľovače, oddeľovače tisícov). Modul `locale` poskytuje funkcie na tento účel.
- **Formátovanie meny:** Používajte formátovanie meny špecifické pre daný lokál. Zvážte použitie knižnice ako `Babel` pre pokročilejšie spracovanie meny.
- **Jazyky písané sprava doľava (RTL):** Podporujte jazyky RTL ako arabčina a hebrejčina. To môže zahŕňať zrkadlenie rozloženia vašej webovej stránky.
- **Kvalita prekladu:** Používajte profesionálnych prekladateľov na zabezpečenie presných a kultúrne vhodných prekladov. Strojový preklad môže byť dobrým východiskovým bodom, ale často si vyžaduje ľudskú kontrolu.
- **Detekcia lokálu používateľa:** Implementujte robustnú detekciu lokálu na základe preferencií používateľa, nastavení prehliadača alebo IP adresy. Poskytnite používateľom spôsob, ako si manuálne vybrať preferovaný jazyk.
- **Testovanie:** Dôkladne otestujte svoju aplikáciu s rôznymi lokálmi, aby ste sa uistili, že všetko sa zobrazuje správne.
Pokročilé témy
Vlastné chybové stránky:
Môžete si prispôsobiť chybové stránky, ktoré Tornado zobrazí, keď nastane chyba. To vám umožní poskytnúť používateľsky prívetivejší zážitok a zahrnúť informácie na ladenie.
Vlastné nastavenia:
Môžete definovať vlastné nastavenia vo vašej konfigurácii aplikácie a pristupovať k nim vo vašich handeroch. To je užitočné pre ukladanie parametrov špecifických pre aplikáciu, ako sú reťazce pripojenia k databáze alebo API kľúče.
Testovanie:
Dôkladne testujte svoje aplikácie v Tornade, aby ste sa uistili, že fungujú správne a bezpečne. Používajte jednotkové testy, integračné testy a end-to-end testy na pokrytie všetkých aspektov vašej aplikácie.
Záver
Tornado je výkonný a všestranný webový framework, ktorý je veľmi vhodný na vytváranie škálovateľných a vysoko výkonných webových aplikácií. Jeho asynchrónna architektúra, podpora WebSocketov a ľahko použiteľné API ho robia populárnou voľbou pre vývojárov po celom svete. Dodržiavaním pokynov a príkladov v tomto komplexnom sprievodcovi môžete začať vytvárať vlastné aplikácie v Tornade a využívať jeho mnohé funkcie.
Nezabudnite sa obrátiť na oficiálnu dokumentáciu Tornada pre najaktuálnejšie informácie a osvedčené postupy. Príjemné kódovanie!