Programavimas

Peržiūra: palyginti 13 „Python“ žiniatinklio sistemų

Jei kuriate žiniatinklio programą ir pasirinkote „Python“ kaip kalbą, kuriai sukurti, tai yra protingas žingsnis. „Python“ vystymosi branda, patikimos bibliotekos ir pritaikymas realiame pasaulyje padėjo padaryti jį nereikalingu interneto kūrimui.

Dabar ateina sunkioji dalis: Pasirinkite vieną iš daugelio galimų „Python“ žiniatinklio sistemų. Tai ne tik tai, kad skaičius nuolat auga, bet gali būti sunku rasti tą, kuris geriausiai atitiktų jūsų naudojimo atvejį. Jei kuriate greitą ir nešvarią „REST“ API, jums nereikės nieko šalia vandentiekio ir laidų, reikalingų visapusiškai vartotojui skirtai programai su vartotojo prisijungimais, formos patvirtinimais ir įkėlimo tvarkymu.

Susijęs vaizdo įrašas: paprastos žiniatinklio programos kūrimas naudojant „Python“ ir „Flask“

Šiame apibendrinime išnagrinėsime 13 plačiausiai diegiamų „Python“ žiniatinklio sistemų. Pažymėsime, kokias žiniatinklio programas geriausiai tinka kurti, ir išsiaiškinsime, kaip jos kaupiasi viena kitai šiose šešiose srityse:

Diegimas: Kaip lengva ar nesudėtinga sukurti sistemą - projektams, kuriems nereikia oficialaus diegimo (jį paprasčiausiai galima įtraukti į esamą projektą kaip įtrauktą modulį), norint pradėti, reikalinga minimali katilinė arba jie yra su iš anksto sukonfigūruotais sąrankos gauti papildomų taškų.

Dokumentacija: Beveik kiekvienas tinkamas „Python“ projektas turi dokumentaciją, kurioje pateikiama sąrankos eiga, iliustruojami pagrindiniai naudojimo atvejai ir pateikiama išsami informacija apie API. Čia mes suteikiame aukštesnius įvertinimus sistemoms, kurios parodo, kaip sukurti visą programą kaip mokymo programos dalį, apima įprastus receptus ar dizaino modelius ir kitaip viršija pareigos raginimą (pvz., Pateikdami išsamią informaciją apie tai, kaip paleisti (pvz., „PyPy“ arba „IronPython“).

Valdymas: Tai yra santykinis balas, nurodantis, kiek darbo reikia norint sukonfigūruoti ir prižiūrėti sistemą. Minimalūs rėmeliai pagal numatytuosius nustatymus yra aukštesni.

Gimtoji galimybė: Kiek baterijų yra? Aukštesni balai skiriami sistemoms, kurios teikia natūralią internacionalizacijos palaikymą, HTML šablonus ir prieigos prie duomenų sluoksnį. Taškai taip pat eina į rėmus, kurie natūraliai naudoja neseniai Python pristatytą savąją asinchroninių įvesties / išvesties operacijų palaikymą.

Saugumas: Karkasai, kuriuose numatytos vietinės saugumo priemonės, pvz., Užklausų suklastojimas keliose vietose (CSRF) ir sesijų valdymas su šifruotais slapukais, gauna aukštesnį įvertinimą.

Mastelis: Daugelis „Python“ sistemų gali naudoti tokius projektus kaip „Gevent“ ar „Gunicorn“, kad galėtų vykdyti mastelį. Čia mes apžvelgiame sistemai būdingas funkcijas, kurios skatina mastelį, pvz., Išvesties ir puslapio fragmentų talpyklą.

Jei norite sužinoti apie našumo etalonus, pažvelkite į vykstančią „TechEmpower“ bandymų seriją, kurioje lyginamos įvairios žiniatinklio sistemos, atliekant įvairias užduotis, su kodu ir metodikomis, paskelbtomis „GitHub“ ir nuolat vertinamose. Ne visos šios diskusijos sistemos yra analizuojamos ten, tačiau galima gerai suprasti, kurios sistemos geriausiai veikia esant tam tikroms apkrovoms.

Apžvelgsime 13 sistemų iš viso. Penki iš jų - „CubicWeb“, „Django“, „Web2py“, „Weppy“ ir „Zope2“ - vadovaujasi „virtuvės kriaukle“, įpakuodami daugumą visų funkcijų, kurias galite įsivaizduoti reikalingas žiniatinklio programai. Likę aštuoni rėmeliai - „Bottle“, „CherryPy“, „Falcon“, „Flask“, „Pyramid“, „Tornado“, „Web.py“ ir „Wheezy.web“ siūlo paprastesnį ir paprastesnį minimalistinį pasirinkimą, didmeninę prekybą ir išsamumą.

Pradėkime nuo sunkiasvorių.

Sunkiasvorės „Python“ žiniatinklio sistemos

„CubicWeb“

„CubicWeb“ yra atsiskaitoma kaip „semantinio žiniatinklio programų sistema, palanki pakartotiniam naudojimui ir objektiniam dizainui“. Tai yra intriguojanti sistema - kaip pažymėjo Rickas Grehanas, kai pažvelgė į ją dar 2011 m. - pabrėžianti abstrakcijų ir daugkartinio naudojimo kodų, vadinamų „kubais“, naudojimą, tačiau kai kuriems kūrėjams tai gali būti per daug abstrakti ar savita.

Kubai yra programinės įrangos komponentai, turintys schemą (duomenų modelis), objektus (programavimo logika) ir rodinius. Surinkdami kelis kubus, kiekvienas atlikdamas savo užduotį, galite kurti programinės įrangos programas pakartotinai naudodami savo ir kitų kodus.

Savo esme „CubicWeb“ pateikia pagrindinius pastolius, naudojamus kiekvienoje žiniatinklio programoje: duomenų saugyklų ir saugyklos „saugyklą“; „žiniatinklio variklis“ pagrindiniams HTTP užklausų / atsakymų ir CRUD veiksmams atlikti; ir duomenų modeliavimo schema. Visa tai aprašyta „Python“ klasės apibrėžimuose. Norėdami nustatyti ir valdyti „CubicWeb“ egzempliorius, dirbate naudodami komandinės eilutės įrankį, panašų į tą, kuris naudojamas „Django“.

Panašu, kad „CubicWeb“ nenaudoja „Python 3“ vietinės asinchroninės funkcijos. Žiedinė sankryža, kaip įtraukti async, būtų naudoti modulį cubicweb.pyramid, kad „Pyramid“ sistema būtų naudojama kaip žiniatinklio serveris, ir piešti ant „Pyramid“ šakės, naudojančios asinchronines konstrukcijas. Bet kol kas viskas tiesmukiškiau atrodo nepasiekiama.

Norėdami gauti ar tvarkyti nuolatinius duomenis „CubicWeb“ programoje, naudojate „Relation Query Language“ (RQL), kurioje naudojama miglotai panaši į SQL sintaksė, tačiau ji sukurta pagal W3C „SparQL“. „CubicWeb“ pagrindimas tai vėlgi yra abstrakcija: RQL suteikia labai atsietą kelią, kad būtų galima susieti įvairius duomenų šaltinius. Tačiau tai įgyvendinus, rankiniu būdu kuriant užklausas kaip eilutes, greičiausiai tai atrodys pasenusi kūrėjams, pripratusiems prie ORM.

Yra ir kitų kliūčių naudojant „CubicWeb“. Pirma, sąranka gali būti vargo. Kadangi „CubicWeb“ turi daug priklausomybių, geriausia naudoti pip įdiegti parsivežti juos visus. Jums taip pat gali tekti atlikti tam tikrą rankinį patikslinimą vietinėje aplinkoje. Tai visiškai prieštarauja kitoms sistemoms, kuriose veikia pip įdiegti arba metant sistemos struktūrą į kito projekto aplanką yra viskas, ko reikia.

Kitas galimas klausimas yra vietinio šablono variklio nebuvimas; HTML generavimas paliekamas kūrėjui. Tai galite įveikti naudodami trečiosios šalies šablonų sistemą, pvz., „Jinja2“, arba pasirinkdami kubą, kuriame pateikiami įrankiai žiniatinklio vartotojo sąsajoms, pvz., „Boostrap HTML“ sistemai.

Išspręsta viena sena „CubicWeb“ problema - „Python 3“ palaikymo trūkumas. Nuo 2016 m. Birželio mėn. Ir 3.23 versijos „Python 3“ palaikymas pateko į „CubicWeb“, išskyrus modulius, tokius kaip „Twisted“, kurie patys nėra visiškai perkelti.

Kaip ir „Web2py“, „CubicWeb“ savo ilgus dokumentus nurodo kaip „knygą“. Reikia laiko paaiškinti neįprastą „CubicWeb“ požiūrį, parodyti, kaip sukurti kai kurias pagrindines programas, įtraukti API nuorodas ir apskritai padaryti viską, kad būtų konkretus.

Django

Dešimtmetyje ir pokyčiuose nuo tada, kai „Django“ pasirodė pirmą kartą, jis tapo vienu iš plačiausiai naudojamų „Python“ tinklalapių kūrimo pagrindų. „Django“ yra su kiekviena baterija, kurios jums gali prireikti, todėl ji labiau linkusi kurti dideles, o ne mažas programas.

Susijęs vaizdo įrašas: paprastos svetainės kūrimas su „Django“

Po daugelio metų sėdėjimo prie 1.x versijos, Django neseniai padarė versiją smūgiu kairėje po kablelio. Didžiausias „Django 2.0“ pokytis yra tai, kad sistema dabar veikia tik su „Python 3.4“ ir naujesnėmis versijomis. Geriausia, jei vis tiek turėtumėte naudoti „Python 3.x“, todėl vienintelė priežastis naudoti „Django“ filialą „1.x“ yra ta, jei esate įstrigę senoje „Python“ versijoje.

Pagrindinė Django patrauklumo dalis yra dislokavimo greitis. Kadangi jame yra tiek daug elementų, kurių reikia vidutinei žiniatinklio programai kurti, galite greitai judėti. Maršrutai, URL analizavimas, duomenų bazių sujungimas (įskaitant ORM), formos patvirtinimas, apsaugos nuo atakos ir šablonai yra integruoti.

Rasite dažniausiai naudojamų žiniatinklio programų scenarijų sudėtines dalis. Pavyzdžiui, vartotojų valdymas yra daugelyje svetainių, todėl „Django“ siūlo jį kaip standartinį elementą. Užuot turėjęs sukurti savo sistemą, skirtą stebėti vartotojų abonementus, seansus, slaptažodžius, prisijungimus / atsijungimus, administratoriaus teises ir pan., „Django“ turi tas savybes. Jie gali būti naudojami tokie, kokie yra, arba išplėsti, kad apimtų naujus naudojimo atvejus su minimaliu darbo kiekiu.

1. Šerdis yra BSD; kai kurie komponentai LGPLv3. 2. Prieinama per zope.formlib; įdiegta atskirai, bet palaikoma kaip projekto dalis. 3. Galima per trečiųjų šalių plėtinį.
 „CubicWeb“Django„Web2py“WeppyZope2
LicencijaLGPLBSDLGPLv3BSD / LGPLv3 [1]„Zope“ viešoji licencija
Gimtoji HTML šablonų sistemaTaipTaipTaipTaipTaip
Gimtoji ORM / duomenų valdymasTaipTaipTaipTaipTaip
Plėtinių bibliotekaTaipTaipTaipTaipTaip
Formos patvirtinimasTaipTaipTaipTaipTaip [2]
Apsaugos nuo klastojimo užklausa keliose vietoseTaipTaipTaipTaipTaip
Vartotojo valdymas / prieiga pagal vaidmenisTaipTaipTaipTaipTaip
„Python 3“ palaikymasTaipTaipNeTaipNe
Duomenų modelių schemų perkėlimaiTaipTaipTaipTaipNe
Atsakymo talpyklaNeTaipTaipTaipTaip
Parama internacionalizacijaiTaipTaipTaipTaipTaip
Vietinių „WebSockets“ palaikymasNeNe [3]TaipNeNe
Interaktyvi kūrimo aplinkaTaipNeTaipNeTaip

„Django“ turi protingus ir saugius numatytuosius nustatymus, kurie padeda apsaugoti jūsų žiniatinklio programą nuo atakos. Kai įdėsite kintamąjį į puslapio šabloną, pvz., Eilutę su HTML ar „JavaScript“, turinys nebus pateiktas pažodžiui, nebent jūs aiškiai nurodysite kintamojo egzempliorių kaip saugų. Tai savaime sumažina daugelį įprastų kelių svetainių scenarijų problemų. Jei norite atlikti formos patvirtinimą, galite naudoti viską, pradedant paprasta CSRF apsauga ir baigiant visapusišku tikrinimu kiekviename lauke, kurie pateikia išsamų klaidų atsiliepimą.

Tokia turtinga ir plati savybė, kokia yra Django, nebūtų daug naudinga, jei prie jos nepateikiama patikima dokumentacija. Django dokumentacijos svetainė išnagrinėja kiekvieną sistemos aspektą keliais kampais. Darbas su „Python 3“ ar kitais kalbos skoniais, teisingas saugumas, bendrų žiniatinklio programų komponentų diegimas (pvz., Sesijos ar puslapių sudarymas), svetainių schemų generavimas - jie visi yra aprėpti. Taip pat išsamiai aprašytos kiekvieno programos sluoksnio - modelio, rodinio ir šablono - API.

Tačiau turint didelę galią atsiranda labai sudėtinga. „Django“ programos turi didelę reputaciją, nes yra ypač sunkios, joje yra daug judančių dalių. Net ir paprastai „Django“ programai, turinčiai tik kelis maršrutus, reikia nemažai konfigūracijos, kad ji būtų paleista. Jei jūsų darbas yra nedaryti nieko daugiau, kaip sukurti keletą paprastų REST galinių taškų, Django beveik neabejotinai yra per didelis.

Django taip pat turi savo keistenybių. Pavyzdžiui, puslapių šablonuose negalima naudoti skambinamųjų. Pavyzdys: galite perduoti {{Vartotojo vardas}} kaip šablono komponentą, bet ne {{user.get_name ()}}. Tai yra vienas iš būdų, kuriais Django užtikrina, kad šablonai netyčia nedaro nemalonių dalykų, tačiau šie apribojimai gali pakenkti, jei nesate jiems pasiruošę. Nors yra problemų sprendimo būdų, jie linkę mokėti našumą.

Django šerdis yra sinchroninė. Tačiau vienas iš būdų pridėti asinchroninį elgesį yra „Django Channels“ projektas. Šis projektas, oficialus „Django“ priedas, „Django“ prideda asinchroninį ryšių ir lizdų valdymą, išsaugant „Django“ programavimo idiomas.

„Web2py“

„Ruby“ pasaulyje „Ruby on Rails“ yra de facto žiniatinklio sistema. DePaulo universiteto informatikos profesorių Massimo Di Pierro įkvėpė „Rails“ sukurti „Python“ žiniatinklio sistemą, kurią būtų taip pat lengva nustatyti ir dirbti. Rezultatas yra „Web2py“.

Didžiausia „Web2py“ atrakcija yra įmontuota kūrimo aplinka. Kai nustatote „Web2py“ egzempliorių, jums suteikiama žiniatinklio sąsaja, iš esmės internetinis „Python“ programų redaktorius, kuriame galite konfigūruoti programos komponentus. Paprastai tai reiškia modelių, rodinių ir valdiklių kūrimą, kurie visi aprašomi naudojant „Python“ modulius ar HTML šablonus. Keletas programų pavyzdžių yra iš „Web2py“. Galite išskirti tuos, norėdami pamatyti, kaip jie veikia, arba panaudoti juos kaip pradinius šablonus, kad sukurtumėte savo programas.

Kūrėjai paprastai įdiegia „Web2py“ tiesiog atsisiųsdami jo šaltinio kodą ir naudodamiesi tuo. Tačiau mažiau techniniams vartotojams, naudojantiems „Windows“ ar „MacOS“, „Web2py“ kūrėjai siūlo versijas, kurios iš esmės yra atskiri serveriai. Atsisiųskite, išpakuokite ir paleiskite vieną iš šių versijų, ir turėsite vietinį žiniatinklio serverį su iš anksto sukonfigūruota „Web2py“ kopija. Tai yra puikus būdas padėti susikurti „Web2py“ programą, kurią tada galima įdiegti kur reikia, kitur.

„Web2py“ žiniatinklio sąsaja buvo sukurta naudojant „Bootstrap 2.16.1“, todėl ją lengva stebėti ir lengvai naršyti. Naršyklės redaktorius nepakeičia pilnaverčio IDE, tačiau jis aprūpintas naudingomis pagalbinėmis priemonėmis, tokiomis kaip eilučių numeravimas ir „Python“ sintaksės paryškinimas (įskaitant automatinę įtrauką). Taip pat yra greita „Python“ apvalkalo žiniatinklio sąsaja, todėl prireikus galite bendrauti su „Web2py“ naudodami komandinę eilutę - tai gera nuolaida ekspertams.

„Web2py“ naudojama duomenų abstrakcijos sistema veikia šiek tiek kitaip nei Django ORM ir kiti jo įkvėpti ORM (pvz., „Peewee“). Šios sistemos naudoja „Python“ klases, kad apibrėžtų modelius, kur „Web2py“ naudojate panašias konstruktoriaus funkcijas define_table kad išaiškintų modelius. Tikėtina, kad dauguma tų skirtumų kankins tik tuos žmones, kurie jau turi patirties su vienu ir pradeda naudoti kitą; jie yra maždaug vienodai kompleksiški naujokams. Tikėtina, kad neturėsite jokių problemų prijungdami „Web2py“ prie duomenų teikėjo, nes ji aptarnauja beveik visas pagrindines egzistuojančias duomenų bazes.

Tikrai naudinga su duomenų baze susijusi funkcija yra galimybė sukurti modelių diagramą, tuo geriau įsivaizduoti, kaip jūsų modeliai yra susiję vienas su kitu. Vis dėlto turėsite įdiegti pygraphviz biblioteką, kad įgalintumėte šią funkciją.

„Web2py“ teikia daugybę kitų profesionalaus lygio komponentų: internacionalizavimo funkcijas, kelias talpyklų talpinimo metodikas, prieigos kontrolę ir autorizavimą ir netgi „front-end“ efektus (pavyzdžiui, formų datos parinkiklį) per integruotą „jQuery“ ir AJAX palaikymą. Taip pat pridedami išorinės ir vidinės tarpinės programinės įrangos kabliai, nors jums neleidžiama naudoti tarpinės programinės įrangos norint pakeisti pagrindines „Web2py“ funkcijas.

Vienas reikšmingas „Web2py“ apribojimas yra tai, kad jis suderinamas tik su „Python 2.x“. Viena vertus, tai reiškia, kad „Web2py“ negali naudoti „Python 3“ asinchroninės sintaksės. Dviems, jei pasikliaujate išorinėmis bibliotekomis, kurios yra išskirtinės „Python 3“, tada jums nesiseka. Tačiau vyksta darbas, kad „Web2py Python 3“ atitiktų reikalavimus, ir tai jau beveik baigta rašyti.

Nenuostabu, kad „Web2py“ dokumentai vadinami „knyga“. Pirma, jis apima stulbinantį kiekį „Web2py“, „Python“ ir abiem naudojamoms diegimo aplinkoms. Antra, jis parašytas labai prieinamu, pasakojimo stiliumi. Trečia, jame išsamiai kalbama apie įprastus programų kūrimo scenarijus. Pavyzdžiui, yra visas skyrius apie „jQuery“ (kartu su „Web2Py“) naudojimą AJAX programų kūrimui.

Weppy

Weppy jaučiasi tarsi pusiaukelėje tarp minimalaus kolbos paprastumo ir Django išbaigtumo. Kuriant „Weppy“ programą yra „Flash“ paprastumas, „Weppy“ turi daugybę „Django“ randamų funkcijų, tokių kaip duomenų sluoksniai ir autentifikavimas. Taigi „Weppy“ tinka programoms, kurios svyruoja nuo itin paprastų iki kukliai įmantrių.

Iš pirmo žvilgsnio Weppy kodas atrodo labai panašus kaip kolbos ar butelio kodas. Norint sukurti ir paleisti pagrindinę, vieno maršruto svetainę, reikia keleto nurodymų. Maršrutus galima apibūdinti per funkcijų dekoratorius (paprastą būdą) arba programiškai, o sintaksė tai padaryti yra labai artima kolbai / buteliui. Šablonai veikia maždaug tuo pačiu, išskyrus nežymius sintaksės variantus.

„Weppy“ kontrastuoja su kitomis sistemomis, įtraukdamas kai kurias funkcijas, kurias jos įtraukia tik kaip papildinius arba priedus. Pavyzdžiui, nei kolboje, nei butelyje nėra įmontuoto ORM ar duomenų valdymo sistemos. „Weppy“ apima ORM, nors ir pagrįstą „pyDAL“ projektu, o ne kur kas populiaresnę „SQLAlchemy“. Weppy netgi palaiko schemų migracijas, kurias Django palaiko kaip savo ORM dalį (be to, Django migracijos sistema yra daug labiau automatizuota). Nors „Weppy“ turi išplėtimo mechanizmą, oficialiai patvirtintų priedų sąrašas yra nedidelis, daug mažesnis nei „Flask“ plėtinių katalogas.

Tokios lengvesnės sistemos kaip „Weppy“ dažnai naudojamos kuriant „RESTful“ API, o „Weppy“ tuo tikslu aprūpinamos patogumo funkcijomis. Įtraukite @service dekoratorių į maršrutą, o jūsų grąžinti duomenys bus automatiškai suformatuoti pasirinkus JSON arba XML.

„Weppy“ apima ir kitas funkcijas, kurios, atrodo, labiau atitinka didesnę sistemą, tačiau jos įgyvendinamos be didelių lėšų. Pavyzdžiai: duomenų patvirtinimo mechanizmai, formos tvarkymas, atsakymo talpykla ir vartotojo patvirtinimas. Visais šiais atvejais Weppy laikosi požiūrio „tik pakankamai“. Pateikiamos funkcijos nėra tokios išsamios, kaip galite rasti „Django“ dydžio sistemoje, tačiau kūrėjui nereikia įdėti daug darbo, kad jos būtų naudingos, ir jas visada galima pratęsti.

Kitas „Weppy“ bruožas, paprastai susijęs su sunkesne struktūra, yra parama internacionalizacijai. Šablonų eilutės gali būti išverstos pagal lokalės failus, pateiktus su programa, kurie yra paprasti „Python“ žodynai. Kalbos pasirinkimą taip pat galima nustatyti analizuojant naršyklės užklausą (tai yra „Accept-Language HTTP“ antraštę) arba susiejant vertimą su konkrečiu maršrutu.

Weppy dokumentai turi tą patį skonį kaip ir pati sistema. Tai švaru, skaitoma ir parašyta vartoti žmonėms. Be įprasto „labas pasaulio“ programos pavyzdžio, ji apima gražią instrukciją, leidžiančią sukurti mikroblogų sistemą kaip pradinį projektą.

Ilgalaikiai „Weppy“ planai apima asinchronizavimą ir lizdus kaip žemo lygio, pirmos klasės subjektus. „Weppy“ kūrėjai planuoja šias funkcijas pristatyti 2.0 versijoje, o tada reikalauti „Python 3.7“ ar naujesnės versijos visoms būsimoms „Weppy“ versijoms.

Rezultatų kortelėGimtoji galimybė (20%) Valdymas (20%) Montavimas (20%) Dokumentacija (20%) Saugumas (10%) Mastelis (10%) Bendras rezultatas (100%)
Butelis 0,1281010877 8.6
„CherryPy“ 17.0.0799988 8.4
„CubicWeb“ 3.26.410871097 8.6
Django 2.11088101010 9.2
Sakalas 1.4.17108877 8.0
Kolba 1.0.2898988 8.4
Piramidė 1.9.28881097 8.4
„Tornado“ 4.3899887 8.3
„Web.py“ 0,398810898 8.5
„Web2py“ 2.16.110971098 8.9
Weppy 1.2.1110899109 9.1
Švokštimas.web 0.1.485998888 8.4
Zope2 2.13.241087999 8.6
$config[zx-auto] not found$config[zx-overlay] not found