Eesti

Põhjalik ülevaade Tornadost, Pythoni veebiraamistikust ja asünkroonsest võrguteegist. Õppige, kuidas ehitada skaleeritavaid ja suure jõudlusega rakendusi üksikasjalike selgituste, näidete ja parimate tavadega.

Tornado dokumentatsioon: põhjalik juhend arendajatele üle maailma

Tornado on Pythoni veebiraamistik ja asünkroonne võrguteek, mis algselt arendati FriendFeedis. See sobib eriti hästi pikaajalist küsitlust (long-polling), WebSocketeid ja muid rakendusi nõudvatele lahendustele, mis vajavad pikaajalist ühendust iga kasutajaga. Selle mitteblokeeriv võrgu I/O muudab selle erakordselt skaleeritavaks ja võimsaks valikuks suure jõudlusega veebirakenduste ehitamiseks. See põhjalik juhend juhatab teid läbi Tornado põhikontseptsioonide ja pakub praktilisi näiteid alustamiseks.

Mis on Tornado?

Oma olemuselt on Tornado veebiraamistik ja asünkroonne võrguteek. Erinevalt traditsioonilistest sünkroonsetest veebiraamistikest kasutab Tornado ühelõimelist, sündmusteahelal (event-loop) põhinevat arhitektuuri. See tähendab, et see suudab hallata paljusid samaaegseid ühendusi, ilma et oleks vaja ühte lõime ühenduse kohta, muutes selle tõhusamaks ja skaleeritavamaks.

Tornado põhifunktsioonid:

Tornado keskkonna seadistamine

Enne Tornado arendusse sukeldumist peate oma keskkonna seadistama. Siin on samm-sammuline juhend:

  1. Installige Python: Veenduge, et teil on installitud Python 3.6 või uuem. Saate selle alla laadida ametlikult Pythoni veebisaidilt (python.org).
  2. Looge virtuaalne keskkond (soovitatav): Kasutage venv või virtualenv, et luua oma projektile eraldatud keskkond:
    python3 -m venv myenv
    source myenv/bin/activate  # On Linux/macOS
    myenv\Scripts\activate  # On Windows
  3. Installige Tornado: Installige Tornado pip-i abil:
    pip install tornado

Sinu esimene Tornado rakendus

Loome lihtsa "Hello, World!" rakenduse Tornadoga. Looge fail nimega app.py ja lisage järgmine kood:

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()

Nüüd käivitage rakendus oma terminalist:

python app.py

Avage oma veebibrauser ja navigeerige aadressile http://localhost:8888. Peaksite nägema "Hello, World!" sõnumit.

Selgitus:

Päringukäsitlejad ja marsruutimine

Päringukäsitlejad on Tornado veebirakenduste alus. Nad määratlevad, kuidas käsitleda saabuvaid HTTP-päringuid vastavalt URL-ile. Marsruutimine kaardistab URL-id konkreetsetele päringukäsitlejatele.

Päringukäsitlejate määratlemine:

Päringukäsitleja loomiseks pärinege klassist tornado.web.RequestHandler ja implementeerige vastavad HTTP-meetodid (get, post, put, delete jne).

class MyHandler(tornado.web.RequestHandler):
 def get(self):
  self.write("This is a GET request.")

 def post(self):
  data = self.request.body.decode('utf-8')
  self.write(f"Received POST data: {data}")

Marsruutimine:

Marsruutimine konfigureeritakse tornado.web.Application'i loomisel. Pakute nimekirja ennikutest, kus iga ennik sisaldab URL-mustrit ja vastavat päringukäsitlejat.

app = tornado.web.Application([
 (r"/", MainHandler),
 (r"/myhandler", MyHandler),
])

URL-mustrid:

URL-mustrid on regulaaravaldised. Saate kasutada regulaaravaldiste gruppe, et püüda kinni URL-i osi ja edastada need argumentidena päringukäsitleja meetoditele.

class UserHandler(tornado.web.RequestHandler):
 def get(self, user_id):
  self.write(f"User ID: {user_id}")

app = tornado.web.Application([
 (r"/user/([0-9]+)", UserHandler),
])

Selles näites vastab /user/([0-9]+) URL-idele nagu /user/123. Osa ([0-9]+) püüab kinni ühe või mitu numbrit ja edastab need user_id argumendina UserHandler'i get meetodile.

Mallide kasutamine

Tornado sisaldab lihtsat ja tõhusat mallimootorit. Malle kasutatakse dünaamiliselt HTML-i genereerimiseks, eraldades esitlusloogika rakenduse loogikast.

Mallide loomine:

Mallid salvestatakse tavaliselt eraldi failidesse (nt index.html). Siin on lihtne näide:

<!DOCTYPE html>
<html>
<head>
 <title>My Website</title>
</head>
<body>
 <h1>Welcome, {{ name }}!</h1>
 <p>Today is {{ today }}.</p>
</body>
</html>

{{ name }} ja {{ today }} on kohatäited, mis asendatakse tegelike väärtustega malli renderdamisel.

Mallide renderdamine:

Malli renderdamiseks kasutage oma päringukäsitlejas meetodit render():

class TemplateHandler(tornado.web.RequestHandler):
 def get(self):
  name = "John Doe"
  today = "2023-10-27"
  self.render("index.html", name=name, today=today)

Veenduge, et template_path seade on teie rakenduse seadetes õigesti konfigureeritud. Vaikimisi otsib Tornado malle kaustast nimega templates, mis asub samas kaustas teie rakenduse failiga.

app = tornado.web.Application([
 (r"/template", TemplateHandler),
], template_path="templates")

Malli süntaks:

Tornado mallid toetavad erinevaid funktsioone, sealhulgas:

Asünkroonsed operatsioonid

Tornado tugevus peitub selle asünkroonsetes võimetes. Asünkroonsed operatsioonid võimaldavad teie rakendusel teostada mitteblokeerivat I/O-d, parandades jõudlust ja skaleeritavust. See on eriti kasulik ülesannete puhul, mis hõlmavad väliste ressursside ootamist, nagu andmebaasipäringud või võrgupäringud.

@tornado.gen.coroutine:

Dekoraator @tornado.gen.coroutine võimaldab teil kirjutada asünkroonset koodi, kasutades yield-võtmesõna. See muudab asünkroonse koodi sünkroonse koodi sarnaseks, parandades loetavust ja hooldatavust.

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'))

Selles näites on http_client.fetch() asünkroonne operatsioon, mis tagastab Future'i. Võtmesõna yield peatab korutiini täitmise, kuni Future on lahendatud. Kui Future on lahendatud, jätkab korutiin tööd ja vastuse keha kirjutatakse kliendile.

tornado.concurrent.Future:

Future esindab asünkroonse operatsiooni tulemust, mis ei pruugi veel saadaval olla. Saate kasutada Future objekte asünkroonsete operatsioonide aheldamiseks ja vigade käsitlemiseks.

tornado.ioloop.IOLoop:

IOLoop on Tornado asünkroonse mootori süda. See jälgib failikirjeldajaid ja sokleid sündmuste osas ning edastab need vastavatele käsitlejatele. Tavaliselt ei pea te IOLoop'iga otse suhtlema, kuid on oluline mõista selle rolli asünkroonsete operatsioonide käsitlemisel.

WebSocketid

Tornado pakub suurepärast tuge WebSocketidele, võimaldades reaalajas suhtlust serveri ja klientide vahel. WebSocketid on ideaalsed rakendustele, mis nõuavad kahesuunalist ja madala latentsusega suhtlust, nagu vestlusrakendused, online-mängud ja reaalajas armatuurlauad.

WebSocketi käsitleja loomine:

WebSocketi käsitleja loomiseks pärinege klassist tornado.websocket.WebSocketHandler ja implementeerige järgmised meetodid:

import tornado.websocket

class WebSocketHandler(tornado.websocket.WebSocketHandler):
 def open(self):
  print("WebSocket opened")

 def on_message(self, message):
  self.write_message(f"You sent: {message}")

 def on_close(self):
  print("WebSocket closed")

 def check_origin(self, origin):
  return True # Enable cross-origin WebSocket connections

WebSocketide integreerimine oma rakendusse:

Lisage WebSocketi käsitleja oma rakenduse marsruutimiskonfiguratsiooni:

app = tornado.web.Application([
 (r"/ws", WebSocketHandler),
])

Kliendipoolne implementatsioon:

Kliendi poolel saate kasutada JavaScripti WebSocketi ühenduse loomiseks ja sõnumite saatmiseks/vastuvõtmiseks:

const websocket = new WebSocket("ws://localhost:8888/ws");

websocket.onopen = () => {
 console.log("WebSocket connection established");
 websocket.send("Hello from the client!");
};

websocket.onmessage = (event) => {
 console.log("Received message:", event.data);
};

websocket.onclose = () => {
 console.log("WebSocket connection closed");
};

Autentimine ja turvalisus

Turvalisus on veebirakenduste arendamise kriitiline aspekt. Tornado pakub mitmeid funktsioone, mis aitavad teil oma rakendusi turvata, sealhulgas autentimine, autoriseerimine ja kaitse levinud veebihaavatavuste vastu.

Autentimine:

Autentimine on kasutaja identiteedi kontrollimise protsess. Tornado pakub sisseehitatud tuge erinevatele autentimisskeemidele, sealhulgas:

Autoriseerimine:

Autoriseerimine on protsess, mille käigus tehakse kindlaks, kas kasutajal on luba konkreetsele ressursile juurde pääseda. Saate oma päringukäsitlejates implementeerida autoriseerimisloogikat, et piirata juurdepääsu vastavalt kasutaja rollidele või õigustele.

Turvalisuse parimad tavad:

Juurutamine

Tornado rakenduse juurutamine hõlmab mitmeid samme, sealhulgas veebiserveri konfigureerimine, protsessihalduri seadistamine ja jõudluse optimeerimine.

Veebiserver:

Saate Tornado juurutada veebiserveri, näiteks Nginxi või Apache'i taha. Veebiserver toimib pöördproksina, edastades sissetulevad päringud Tornado rakendusele.

Protsessihaldur:

Protsessihaldurit nagu Supervisor või systemd saab kasutada Tornado protsessi haldamiseks, tagades, et see taaskäivitatakse automaatselt, kui see kokku jookseb.

Jõudluse optimeerimine:

Rahvusvahelistamine (i18n) ja lokaliseerimine (l10n)

Globaalsele publikule rakenduste loomisel on oluline arvestada rahvusvahelistamise (i18n) ja lokaliseerimisega (l10n). i18n on rakenduse disainimise protsess nii, et seda saaks kohandada erinevatele keeltele ja piirkondadele ilma tehniliste muudatusteta. l10n on rahvusvahelistatud rakenduse kohandamise protsess konkreetse keele või piirkonna jaoks, lisades lokaadipõhiseid komponente ja tõlkides teksti.

Tornado ja i18n/l10n

Tornadol endal ei ole sisseehitatud i18n/l10n teeke. Siiski saate hõlpsasti integreerida standardseid Pythoni teeke nagu `gettext` või keerukamaid raamistikke nagu Babel, et hallata i18n/l10n oma Tornado rakenduses.

Näide `gettext` kasutamisega:

1. **Seadistage oma lokaadid:** Looge iga keele jaoks, mida soovite toetada, kaustad, mis sisaldavad sõnumikatalooge (tavaliselt `.mo` failid).

locales/
 en/LC_MESSAGES/messages.mo
 fr/LC_MESSAGES/messages.mo
 de/LC_MESSAGES/messages.mo

2. **Ekstraheerige tõlgitavad stringid:** Kasutage tööriista nagu `xgettext`, et ekstraheerida tõlgitavad stringid oma Pythoni koodist `.po` (Portable Object) faili. See fail sisaldab algseid stringe ja kohatäiteid tõlgetele.

xgettext -d messages -o locales/messages.po your_tornado_app.py

3. **Tõlkige stringid:** Tõlkige `.po` failides olevad stringid iga keele jaoks.

4. **Kompileerige tõlked:** Kompileerige `.po` failid `.mo` (Machine Object) failideks, mida `gettext` kasutab käitusajal.

msgfmt locales/fr/LC_MESSAGES/messages.po -o locales/fr/LC_MESSAGES/messages.mo

5. **Integreerige oma Tornado rakendusse:**

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:
  # Handle cases where the locale is not supported by the system
  print(f"Locale {self.get_user_locale().code} not supported")

  translation = gettext.translation('messages', 'locales', languages=[self.get_user_locale().code])
  translation.install()
  self._ = translation.gettext

 def get_current_user_locale(self):
  # Logic to determine user's locale (e.g., from Accept-Language header, user settings, etc.)
  # This is a simplified example - you'll need a more robust solution
  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. **Muutke oma malle:** Kasutage funktsiooni `_()` (seotud `gettext.gettext`-iga), et märkida stringid oma mallides tõlkimiseks.

<h1>{{ _("Tere tulemast meie veebisaidile!") }}</h1>
<p>{{ _("See on tõlgitud lõik.") }}</p>

Olulised kaalutlused globaalsele publikule:

Edasijõudnute teemad

Kohandatud vealehed:

Saate kohandada vealehti, mida Tornado kuvab vea ilmnemisel. See võimaldab teil pakkuda kasutajasõbralikumat kogemust ja lisada silumisteavet.

Kohandatud seaded:

Saate oma rakenduse konfiguratsioonis määratleda kohandatud seadeid ja neile oma päringukäsitlejates juurde pääseda. See on kasulik rakendusespetsiifiliste parameetrite, näiteks andmebaasi ühenduse stringide või API-võtmete salvestamiseks.

Testimine:

Testige oma Tornado rakendusi põhjalikult, et tagada nende korrektne ja turvaline toimimine. Kasutage ühikteste, integratsiooniteste ja otsast-lõpuni teste, et katta kõik oma rakenduse aspektid.

Kokkuvõte

Tornado on võimas ja mitmekülgne veebiraamistik, mis sobib hästi skaleeritavate ja suure jõudlusega veebirakenduste ehitamiseks. Selle asünkroonne arhitektuur, WebSocketi tugi ja lihtsasti kasutatav API teevad sellest populaarse valiku arendajatele üle maailma. Järgides selle põhjaliku juhendi juhiseid ja näiteid, saate alustada oma Tornado rakenduste ehitamist ja ära kasutada selle paljusid funktsioone.

Pidage meeles, et kõige ajakohasema teabe ja parimate tavade saamiseks konsulteerige ametliku Tornado dokumentatsiooniga. Head kodeerimist!