licenta magazin online

104
UNIVERSITATEA “SPIRU HARET” BUCURESTI FACULTATEA DE MATEMATICA SI INFORMATICA LUCRARE DE LICENȚĂ Coordonator Științific: Student:

Upload: cristi-danila

Post on 11-Nov-2015

418 views

Category:

Documents


46 download

DESCRIPTION

Lucrare de licenta despre cum se creeaza un magazin online folosind tehnologii web moderne, dar si informattii despre tehnicile actuale de proiectare ale unei astfel de aplicatii

TRANSCRIPT

UNIVERSITATEA SPIRU HARET BUCURESTIFACULTATEA DE MATEMATICA SI INFORMATICA

LUCRARE DE LICENCoordonator tiinific:Student:

David Laureniu-Georgian2015UNIVERSITATEA SPIRU HARET BUCURESTIFACULTATEA DE MATEMATICA SI INFORMATICA

Coordonator tiinific:

Student:

David Laureniu-Georgian2015Cuprins

4I INTRODUCERE

41.1 Comertul Electronic

7I.2 Beneficiile comertului electronic

9I.3 Modele de afaceri

13II ROLUL I IMPORTANA INTERNETULUI I A PAGINILOR WEB

13II.1 Scurct Istoric

15II.2 Prezentare si importanta

17II.3 HTML. Prezentare

22II.4 CSS. Prezentare

25II.5 JavaScript. Prezentare

25II.5.1 Limbajul JavaScript

31II.5.2 Prezentarea bibliotecii JQuery

33II.6 Limbaje de scripting

33II.6.1 Python. Prezentare

38II.6.2 Frameworkul web Flask

41II.6.3 Administrarea bazelor de date cu SQLAlchemy

44III. ARHITECTURA MAGAZINULUI WEB

44III.1 Prezentarea magazinului

54III.2 Strucura backendului aplicaiei

64III.3 Structura bazei de date

72IV. CONCLUZII

74V. BIBLIOGRAFIE

I INTRODUCERE

1.1 Comertul Electronic

ntreprinderile moderne sunt caracterizate printr-o cerere din ce in ce mai mare, prin existena unei competiii la nivel mondial si prin sporirea permanent a ateptrilor clienilor. Ca s poat raspunda acestor cerinte, ntreprinderile de pe tot globul sunt n plin proces de tranformare organizational si a modului lor de funcionare. Comerul electronic este o cale prin care se faciliteaz si sprijin aceste schimbri, la scar global.

Pentru unele firme, comert electronic nseamna orice tranzactie financiar care utilizeaz tehnologia informatic. Pentru altele, notiunea de comert electronic acoper circuitul complet de vanzri - inclusiv marketingul si vanzarea propriuzis.

Multi oameni consider comertul electronic ca fiind orice tranzactie comercial condus electronic pentru cumpararea unor produse cum ar fi crti, CD-uri, bilete de calatorie si altele. Dar, comertul electronic are, in sens larg, un impact mult mai profund asupra evolutiei afacerilor si cuprinde, in fapt, nu numai noile achiziii comerciale ci i totalitatea activitilor care susin obiectivele de marketing ale unei firme i care pot include, spre exemplu, publicitate, vanzri, plai, activitai post-vanzare, servicii catre clieni, etc.

Comertul electronic da posibilitatea firmelor sa devina mai eficiente si flexibile in modul intern de funcionare, s conlucreze mai strns cu furnizorii si sa devina mai atente fa de nevoile si asteptrile clienilor. Permite companiilor sa selecteze cei mai buni furnizori, indiferent de localizarea lor geografica i s vand unei piee globale.

Aceast evoluie are un impact major asupra economiei, in ceea ce priveste crearea de noi ntreprinderi, diversificarea celor existente i, n special, asupra potenialului pieei forei de munc i a gradului de ocupare a acesteia in viitor. Industria comerului electronic face, n general, distincie ntre mai multe tipuri de tranzacii, unele active altele n ateptarea:-Business-to-Business (B-2-B sau BTB) cuprinde toate tranzaciile ce se efectueaza intre doi sau mai muli parteneri de afaceri. Aceste tranzacii se bazeaza, de obicei, pe sisteme extranet, ceea ce nseamna ca partenerii de afaceri acioneaza pe internet prin utilizarea de nume si parole pentru paginile de web proprii. n termeni practici, n aceasta categorie de comer electronic poate fi orice firma care utilizeaza internetul pentru a comanda de la furnizori, pentru a primi facturi si a efectua plai.

- Business-to-Consumer (B-2-C sau BTC) se refera la relaiile dintre comerciant si consumatorul final, fiind considerat comer electronic cu amnuntul. Aceasta categorie s-a extins foarte mult datorita World Wide Web : exista acum mall-uri pe tot internetul care ofer toate tipurile de bunuri de consum, de la prjituri sau vinuri, la calculatoare si automobile.- Business-to-Administration (B-2-A sau BTA) acopera toate tranzactiile dintre firme si autoriti administrative locale sau centrale. Spre exemplu, In Statele Unite ale Americii, licitaiile publice lansate de guvern sunt publicate pe internet iar firmele pot rspunde pe cale electronic. In momentul de fata, aceasta categorie de comert electronic este intr-o faza de dezvoltare primar, dar se asteapt o extindere rapid, mai ales in contextul in care guvernele si alte autoritai folosesc propriile metode de promovare a comerului electronic. Aceasta categorie de e-commerce ar putea, n viitor, sa fie utilizat i pentru plata TVA sau a impozitelor firmelor.

Majoritatea afacerilor dezvoltate pe Internet, cu comer electronic, s-au dezvoltat n aria Business-to-Business i mai puin Busines-to-Consumer. Business-to-Business(B2B) const n realizarea de tranzacii ntre companii, transformnd modul n care acestea lucreaz ntre ele. Iniial transferul dintre companii se realiz prin intermediul unui sistem electronic de transfer numit EDI(Electronic Data Interchange). Transferul electronic care are la baz sistemul EDI transmitea datele conform unui format standard. Avnd n vedere faptul c documentele erau aproximativ n acelai format, s-au putut realiza standarde dup acestea i a fost posibil trecerea lor n format electronic. Datorit faptului c reelele EDI aveau un cost ridicat, multe companii foloseau linii nchiriate sau serviciile unor firme care ofereau conexiuni si servicii de transmisie celor angajai n EDI (VAN Value Added Network).

Folosirea unei astfel de metode pentru transferul datelor a prezentat ansa de a diminua costurile pentru completarea formulalelor, listarea, trimiterea sau stocarea din nou ntr-un sistem informatic odat ajunse la destinatar, precum i erorile ce ar fi rezultat prin introducerea repetat a datelor.

Odat cu apariia Internetului s-a trecut la comerul electronic bazat pe internet deoarece folosirea acestuia este mai puin costisitoare. Comerul electronic bazat pe Internet a cunoscut mai multe etape:- etapa iniial, etap n care e-mail-ul a fost cea mai folosit tehnologie de transfer a datelor;

- etapa www, care a luat natere odat cu apariia primului browser web(Mosaic);

- etapa interactiv, cnd multe website-uri au introdus protocoale securizate de

comunicaie, aplicaii software pe partea de server i/sau client, formulare, asigurnd

interactivitatea client-furnizor; - etapa maturizrii web-ului, caracterizat de introducerea lui n cadrul intranet- ului organizaiei, utilizarea extranet-ului ntre organizaii, utilizarea tehnologiei Python i a capabilitilor multimedia ale Web-ului, care a devenit, astfel, un valoros canal de reclam i publicitate(Pia Electronic).

I.2 Beneficiile comertului electronic

n cazul comerului electronic exist avantaje att pentru vnzator ct i pentru

cumprtor. Avantajele pentru vnztor sunt urmtoarele:

- dispariia limitelor geografice de vnzare;

- publicitatea online poate atinge publicul int mai uor;

- dezvoltarea de noi produse se poate realiza mai uor n concordana cu cerinele consumatorului;

- adaptarea la schimbri este mai rapid;

- disponibilitatea informaiilor despre clieni;

- economii la vnzarea produsului;

- mbuntirea relaiilor cu clienii;

- reducerea erorilor prin automatizarea proceselor de plat;

- operabilitate 24 ore / zi, 7 zile pe saptaman.

Pentru cumprtor, comerul electronic aduce urmtoarele avantaje:

- timpul redus de acces la produs;

- identificarea mult mai uoar de furnizori i parteneri de afaceri;

- economii la cumprarea prosusului;

- negocierea preurilor se face mai uor;

- scderea costurilor tranzaciilor prin creterea vitezei de transfer a informaiei;

- distribuirea online pentru produse digitale;

- lucrul la distan;

- accesul la produse/servicii din zone aflate la distan(exemplu: nvmnt la distan).

Dezavantaje:

- imposibilitatea de a realiza cu succes transferuri online a unor produse i servicii (exemplu: produse alimentare perisabile, bijuterii unicat, alte produse imposibil de inspectat la distan, indiferent de tehnologiile curente); - posibiliatea de non-profit n cazul anumitor produse;

- credibilitate sczut;

- integrarea greoaie a bazelor de date i a software-ului de procesare a tranzaciilor tradiionale cu software pentru comer electronic (aceste servicii de integrare pot fi costisitoare).

Pe lng problemele tehnologice i legate de software, exist i alte obstacole:

- de natur cultural i legal;

- legate de securitatea comerului electronic;

- legate de confidenialitatea datelor (ce tranzacii efectueaz, ce site-uri viziteaz, ce preocupri are fiecare persoan etc.).

I.3 Modele de afaceri

Analiznd aplicaiile curente dezvoltate pe Internet, identificm urmtoarele modele

de afaceri n comerul electronic:

- magazin electronic (e-shop): un magazin electronic se implementeaz prin intermediul unui site Web; acesta este gestionat de o companie, pentru marketingul i vnzrile propriilor produse i servicii. Minimal, conine catalogul de produse sau servicii cu descrieri tehnice i comerciale pentru fiecare poziie din catalog. Aceste descrieri sunt gestionate n general de un Sistem de Gestiune al Bazelor de Date (SGBD). Sistemul de Gestiune al Bazelor de Date, se va ocupa cu stocarea i manipularea datelor i cu oferirea posibilitilor de acces la date. Varianta medie conine faciliti pentru preluarea comenzilor (prin e-mail sau forme interactive pe care le vor completa clienii), iar varianta extins cuprinde i posibilitatea efecturii on-line a plii (prin cri de credit sau alte variante electronice).

- aprovizionarea electronic (eProcurement): pentru procurarea bunurilor i serviciilor, marile companii i autoriti publice organizeaz licitaii. Prin publicarea pe Web a specificaiilor ofertei, scade att timpul ct i costul de transmisie, mrindu-se i numrul de firme care iau parte la licitaie. Astfel, crete concurena i scade preul.

- magazin electronic universal (eMall): ca i n lumea real, magazinul electronic universal este o colecie de magazine electronice, reunite sub o umbrel comun i care, n general, accept metode de plat comune.

- piaa unui ter (3rd party marketplace): se apeleaz la o interfa utilizator pentru catalogul de produse al companiei, interfa ce aparine unui ter (n general, furnizor de servicii internet sau o banc). Aceast metod are avantajul c interfaa este unic pentru mai muli productori, utilizatorii fiind familiarizai cu utilizarea ei

- comuniti virtuale (virtual communities): valoarea cea mai important a unei comuniti virtuale este dat de ctre membrii si (clieni sau parteneri), care adaug informaii proprii peste un mediu de baz furnizat de companie. Fiecare membru poate oferi spre vnzare produse sau servicii sau poate adresa cereri de cumprare a unor produse sau servicii. Calitatea de membru al unei comuniti virtuale presupune plata unei taxe.

- furnizor de servicii cu valoare adugat pentru canalele de comer electronic (value chain service provider): furnizorii de servicii sunt specializai pe funcii specifice, cum ar fi asigurarea logisticii, plata electronic sau expertiza n managementul produciei i a stocurilor. Plata acestor servicii se face pe baza unor tarife sau a unei cote procentuale.

- platforme de colaborare: platformele de colaborare cuprind un set de instrumente i un mediu informaional pentru colaborarea ntre companii. Acestea pot adresa funcii specifice, cum ar fi concepia sau proiectarea n colaborare. Ctigurile provin din managementul platformei (taxa de membru sau taxa de utilizare), i din vnzri de instrumente specializate (pentru design, workflow i gestiunea de documente). Prin workflow se nelege fluxul de documente, care implic dou entiti: partea pasiv (documentele) i partea activ (deplasarea acestor documente).

- brokeraj de informaii i alte servicii: exemplele cuprind cataloage de clieni clasificai pe profil, vnzarea de oportuniti de afaceri, consultan n domenii specializate. O categorie special o constituie serviciile de ncredere furnizate de autoritile de certificare sau de notariatele electronice.

Un sistem electronic de pli se refer la totalitatea obiectelor care conlucreaz pentru asigurarea plii tranzaciilor ce se efectueaz. Sunt implicate, n general, trei entiti care interacioneaz: o banca B, un cumprtor C i un vnztor V. Sistemul electronic de pli conine i o mulime de protocoale care permit cumprtorului C s fac pli ctre vnztorul V. Sistemele electronice de pli pot fi privite ntr-o structur ierarhic pe nivele, derivate din arhitectura sistemelor ISO-OSI .

Un Sistem Electronic de Pli (Fig. 1.3) este format din doua nivele:

- nivelul utilizator, care constituie nivelul ierarhic superior;

- nivelul sistem, care constituie nivelul ierarhic inferior.

Nivelul utilizator const din mulimea utilizatorilor i a tranzaciilor care au loc ntre acetia. Utilizatorii sunt grupai dup diverse roluri, dup modul n care interacioneaz n relaiile de afaceri dintre ei: cumprtorul, vnztorul, emitentul de bani electronici (banca), etc.

Nivelul sistem: const din mulimea entitilor fizice i a relaiilor care se stabilesc ntre ele. Entitile pot juca unul dintre urmtoarele roluri: purttor de bani electronici sau registru de cas.

De-a lungul ultimilor ani, Comerul Electronic a devenit o activitate comun pentru multe companii. Unele dintre acestea au acceptat aceast provocare, fr a lua n considerare schimbrile culturale pe care le implic situaia n cauz, precum i infrastructura necesar pentru a continua proiectul iniial.

Pentru a ncepe dezvoltarea unei afaceri n lumea electronic, exist unele puncte care trebuie s fie acoperite. n primul rnd este necesar s se stabileasc o strategie de marketing, pentru a crea un catalog de produse, pentru a defini costurile i preurile de vnzare, piaa int, preurile de transport i de manipulare.

n prezent, majoritatea companiilor doresc s includ dezvoltarea E-Business. Aceast nou tehnologie, care se bazeaz pe Internet, este i va rmne pentru o lung perioad de timp o variant de dezvoltare a unei afaceri. Pentru a putea utiliza aceast tehnologie ntr-un mod corespunztor, este necesar s se bazeze pe o bun organizare a informaiilor i proceselor. Aceasta este o provocare, datorit faptului c cele mai multe companii nu au propriile lor sisteme care s ofere sprijin pentru a rezolva nevoile specifice. Pentru a realiza o dezvoltare corespunztoare a acestui proiect este nevoie de o companie care are personal calificat.

II ROLUL I IMPORTANA INTERNETULUI I A PAGINILOR WEB

II.1 Scurct Istoric

Internetul s-a nscut la mijlocul anilor 60 n forma ARPAnet (Advanced Research Projects Agency Net) - o reea ntre mai multe computere din unele instituii americane, ce lucrau pentru ARPA, un departament de cercetare din cadrul Pentagonului. ARPA a fost pus n funciune ca reacie la succesul sovietic al lansrii satelitului Sputnik n spaiu n 1957. Unul din obiectivele ARPAnet era crearea unei reele, care s nu fie distrus datorit atacurilor asupra sistemului. Rzboiul Rece fiind la apogeu, scenariul unui dezastru era considerat fie lansarea unei bombe fie un atac nuclear.

De aici a rezultat un proiect de reea, unde reeaua nsi era permanent n pericol de atac. n consecin:- doar un minimum de informaii era cerut de la computerele client n reea - oricnd transmisia de date ntlnea un obstacol, sau una dintre adrese era de negsit, se gsea o alt cale ctre adresa cutat.

Toate acestea au fost codificate ntr-un protocol care reglementa transmisia de date pe Internet. n forma sa final, acesta era TCP/IP (Transmission Control Protocol / Internet protocol), care este i acum baza Internetului. TCP/IP face posibil ca modele diferite de calculatoare, de exemplu IBM compatibile sau Mac's, folosind sisteme diferite sisteme de operare, cum ar fi UNIX, Windows, MacOS etc. S se "neleag" unele cu altele. n acest fel, internetul era i este cu adevrat o platform independent.

Internet-ul "civil" a nceput ca o reea de patru computere ntre Universitile din Utah, Santa Barbara i Los Angeles i Institutul de Cercetare din Stanford. n curnd, cercettori din alte instituii de stat au devenit interesai. Deoarece folosirea computerelor era costisitoare, ei au vzut imediat avantajele folosirii n comun a unei reele.

La sfritul anilor 60 i nceputul anilor 70, cnd Internetul numra n jur de 50 de computere, s-au dezvoltat primele dintre servicii, folosite nc i azi pentru transferul informaiei:- File Transfer Protocol pentru trimiterea i regsirea fiierelor - Telnet pentru accesarea i folosirea bazelor de date, a bibliotecilor i a cataloagelor din toat lumea - E-Mail pentru trimiterea mesajelor personale.

Internetul era n mod categoric n ascenden. Cu noi grupuri de utilizatori care se alturau, n urmtoarea decad, Internetul a crescut la o reea de 200 de computere. Partea militar era organizat ntr-o reea separat, Milnet.

n acelai timp, au aprut alte reele, mai ales n sectorul academic. Important printre acestea era (i este) USENET sau Users' Network, care a nceput n 1979, cnd cteva computere UNIX au fost conectate mpreun.

USENET. n sute de grupuri de discuii despre orice subiect imaginabil, oamenii fceau schimb de nouti i imagini, n ciuda distanelor i a hotarelor. Alte reele s-au dezvoltat de-a lungul USENETului. Toate formau baza unui spaiu de comunicaie radical democratic. De exemplu, naintea unei noi discuii pe care grupul o ncepea, comunitii Netului i se cerea un vot de accept. Grupurile de discuii joac nc un rol mare pe Internet. Exist mii i zeci de mii n ntreg internetul.

Alt motenire a USENET este "Netiquette", sau regulile de comportament pe Internet.

10 ani dup ce USENET i ncepuse dezvoltarea, Internetul a crescut la 80.000 de computere. A nceput s fie un factor de luat n considerare n politic. i curnd, expresia "Information SuperHighway" (autostrada informaiei) a devenit uzual. n aceast metafor, Internetul era vzut ca o important infrastructur pentru transportul unor bunuri vitale - informaiile.

n anii 80 i nceputul anilor 90, cnd Internetul era folosit doar de un numr mic de cercettori, arata mult diferit fa de prezent. Principalele aplicaii erau atunci pota electronic i grupurile de discuii (Newsgroups) plus diverse rutine de cutare i mecanisme de transfer al fiierelor. Aceasta era o lume UNIX, n care toate comunicaiile existau doar ca text sau numere, i liniile de comand trebuiau memorate i tiprite.

Era destinat s fie o platform intern de comunicaii pentru cercettorii din ntreaga lume care lucrau pentru CERN. Sarcina principal era s asigure un sistem care s fac legtura ntre varietatea de platforme ale diverselor calculatoare.

Soluia de baz era ideea de a face legtura ntre documente via "hipertext". Hipertext nseamn, a marca irurile de text sau alte obiecte i de a le lega cu alte obiecte, care ar putea fi din punct de vedere fizic la mare distan de obiectul original. Cnd legtura este selectat, cineva poate "sri" la documentul legat. n acest fel este posibil de a lega un numr nelimitat de documente ntre ele ntr-o structur web ne-ierarhic. Pentru a putea deosebi aceste documente i pentru a le regsi, fiecare are o adres unic. Aceasta este Unique Resource Locator (URL). URL-urile constau ntr-un protocol de transmitere (n cazul WWW-ului acesta este Hypertext Transfer Protocol - http), urmat de www (n cele mai multe cazuri) i de domeniu (de exemplu numele serverului i numele paginii).

Prima versiune a programelor pentru a naviga pe www, aa numitele "browsere" urmau nc tradiia original a internetului - erau numai text. De aceea, sistemul a rmas, n principiu, neprietenos cu utilizatorii. n septembrie 1992 nu existau mai mult de 20 de servere web n ntreaga lume.

Schimbarea radical s-a produs cnd NCSA (National Center for Supercomputing Applications) din SUA a scos "Mosaic" - Browser n 1993, care era bazat pe o interfa grafic (Windows). Enorma cretere a web-ului a nceput virtual, dintr-o dat: n iunie 1993, 130 servere Web erau nregistrate, n 1994 erau deja 11.576 servere.

Dar web-ul nu a fcut doar s se dezvolte. De asemenea, posibilitile de a prezenta datele au crescut dramatic. Curnd au aprut poze i animaii pe situri web, urmate de sunete . Doar un mic pas mai era necesar pentru a aduce cataloage, directoare i formulare de comand pe situri web. Astfel, civa ani mai trziu s-a nscut E-Commerce.II.2 Prezentare si importanta

n Romnia, penetrarea internetului a crescut constant n ultimii ani, atingnd 53% la nivel naional i 63% la nivel urban n rndul persoanelor cu vrsta de peste 15 ani n aprilie 2013. n acelai timp, apetitul romnilor pentru tablete i smartphone-uri este n continu cretere. Vnzrile au cunoscut o important tendin ascendent n ultimii ani, smartphone-urile ajungnd la o pondere de 25% din totalul pieei de telefoane mobile n uniti n 2012, iar numrul de tablete vndute a crescut de aproape 5 ori n 2012 fa de 2011.

Aceste evoluii ncep s i pun amprenta nu doar asupra stilului de via al consumatorilor, ci i asupra comportamentului lor de cumprare. Dac pn nu de mult magazinele i mediile tradiionale de comunicare erau principalele surse de informare n vederea lurii deciziei de cumprare, n prezent internetul este utilizat pe scar larg.

Un studiu desfurat de GfK Romnia pe un eantion reprezentativ pentru populaia urban utilizatoare de Internet, cu vrste ntre 15 i 45 de ani, relev rolul important al internetului n redefinirea comportamentului de cumprare. 70% dintre cei chestionai declar c Internetul a devenit un instrument de cumprare foarte util, iar 44% menioneaz c reelele sociale au devenit la fel de importante ca i alte surse de informaii pentru a face cele mai bune alegeri de produse.

Accesarea site-urilor de comparare a preurilor, consultarea online a descrierilor detaliate ale produselor i a recenziilor altor cumprtori, schimbul de informaii din reelele sociale, toate acestea sunt activiti desfurate din ce n ce mai mult n vederea lurii celei mai bune decizii de cumprare, care s aduc cea mai mare valoare cumprtorului. Astfel, accesul la surse multiple de informare ne transform pe toi n cumprtori mult mai implicai i mai exigeni, mai dificil de mulumit dect nainte, spune Raluca Rschip, Consumer Goods & Retail Director GfK Romnia.

n afar de mediul online, treptat se dezvolt i alte medii de interaciune, cum ar fi cel prin intermediul smartphone-urilor. Dac n momentul de fa smartphone-ul este folosit cu precdere pentru a compara preuri (44% dintre deintorii care s-au informat online sau au cumprat online n ultimele 6 luni), pentru a cuta informaii i recenzii (42%) i pentru a localiza magazine (42%), i alte tipuri de comportamente ncep s apar: verificarea disponibilitii unui produs (31%) sau scanarea de coduri QR (22%).

n acest mediu n care cumprtorul este mult mai contient de instrumentele pe care le are la ndemn i mai implicat n procesul de cumprare, utiliznd tot mai multe prghii pentru a maximiza valoarea pe care o obine, devine tot mai dificil pentru productori i pentru retaileri s pstreze un nivel de loialitate ridicat.

De aceea, cunoaterea modului n care cumprtorii se informeaz i folosesc noile tehnologii, a diversitii stimulilor cu care acetia intr n contact n procesul de cumprare, devine din ce n ce mai important pentru asigurarea succesului pe pia, nu doar pentru a rspunde nevoilor actuale ale cumprtorilor, ci i pentru a anticipa nevoi viitoare ntr-un peisaj din ce n ce mai digitalizat.II.3 HTML. Prezentare

Unul din primele elemente fundamentale ale WWW (World Wide Web) este HTML (Hypertext Markup Language), care descrie formatul primar in care documentele sunt distribuite si vzute pe Web. Multe din trasaturile lui, cum ar fi independenta fata de platforma, structurarea formatrii si legaturile hypertext, fac din el un foarte bun format pentru documentele Internet si Web.

Primele specificaiile de baza ale Web-ului au fost HTML, HTTP si URL.

HTML a fost dezvoltat initial de Tim Berners-Lee la CERN in 1989. HTML a fost vazut ca o posibilitate pentru fizicienii care utilizeaza computere diferite si schimbe ntre ei informaie utilizind Internetul. Erau prin urmare necesare citeva trasaturi: independenta de platforma, posibiliti hypertext si structurarea documentelor.Independenta de platforma nseamn ca un document poate fi afiat in mod asemntor de computere diferite, lucru vital pentru o audien att de variat.

Hipertext nseamn ca orice cuvnt, fraza, imagine sau alt element al documentului vzut de un utilizator (client) poate face referina la un alt document, ceea ce uureaz mult navigarea intre multiple documente sau chiar in interiorul aceluiai document. Structurarea riguroasa a documentelor permite convertirea acestora dintr-un format in altul precum si interogarea unor baze de date formate din aceste documente.

Standardul oficial HTML este World Wide Web Consortium (W3C), care este afiliat la Internet Engineering Task Force (IETF). W3C a enunat cteva versiuni ale specificaiei HTML, printre care si HTML 2.0, HTML 3.0, HTML 3.2, HTML 4.0 si, cel mai recent, HTML 4.01. In acelai timp, autorii de browsere, cum ar fi Netscape si Microsoft, au dezvoltat adesea propriile "extensii" HTML in afara procesului standard si le-au incorporat in browserele lor. In unele cazuri, cum ar fi tagul Netscape , aceste extensii au devenit standarde de facto adoptate de autorii de browsere.

HTML 2.0, elaborat in Iunie 1994, este standardul pe care ar trebui sa-l suporte toate browserele curente -- inclusiv cele mod text. HTML 2.0 reflecta concepia originala a HTML ca un limbaj de marcare independent de obiectele existente pentru aezarea lor in pagina, in loc de a specifica exact cum ar trebui sa arate acestea. Dac dorii sa fii siguri ca toi vizitatorii vor vedea paginile aa cum trebuie, folosii tagurile HTML 2.0.

Specificaia HTML 3.0, Enunata in 1995, a ncercat sa dezvolte HTML 2.0 prin adugarea unor faciliti precum tabelele si un mai mare control asupra textului din jurul imaginilor. Dei unele din noutile HTML 3.0 erau deja folosite de autorii de browsere, multe nu erau nc. In unele cazuri, taguri asemntoare implementate de autorii de browsere au devenit mai rspndite dect tagurile "oficiale". Specificaia HTML 3.0 acum a expirat, deci nu mai este un standard oficial.

In Mai 1996, W3C a scos pe piaa specificaia HTML 3.2, care era proiectata sa reflecte si sa standardizeze practicile acceptate la scara larga. Deci, HTML 3.2 include tagurile HTML 3.0 ce erau adoptate de autorii de browsere ca Netscape si Microsoft plus extensii HTML rspndite. In Bilanul asupra HTML, W3C recomanda ca providerii de informaii sa utilizeze specificaia HTML 3.2.Versiunile curente ale majoritii browserelor ar trebui sa suporte toate, sau aproape toate aceste taguri.

De asemenea exista extensii Netscape si Microsoft care nu fac parte din specificaia HTML 3.2, ori pentru ca sunt mai puin utilizate, ori au fost omologate dup apariia HTML 3.2. Pentru ca navigatorul Netscape a fost printre primele browsere care suporta anumite taguri HTML 3.0, iar Netscape deine in jur de 70% din piaa de browsere, muli au crezut eronat ca toate extensiile Netscape (incluznd taguri ca si facilitai ca ferestrele) fac parte din HTML 3.0 sau HTML 3.2.

Documentele HTML sunt documente in format ASCII si prin urmare pot fi create cu orice editor de text. Au fost, nsa, dezvoltate editoare specializate care permit editarea intr-un fel de WYSIWYG dei nu se poate vorbi de WYSIWYG atta vreme cat navigatoarele afieaz acelai document oarecum diferit, in functie de platforma pe care ruleaza. Au fost, de asemenea, dezvoltate convertoare care permit formatarea HTML a documentelor generate (si formatate) cu alte editoare. Evident conversiile nu pot pastra dect parial formatrile anterioare deoarece limbajul HTML este nca incomplet.

Orice document HTML ncepe cu notaia si se termina cu notaia . Aceste entitai se numesc in literatura de specialitate "TAG-uri". Prin convenie, toate informaiile HTML ncep cu o parantez unghiular deschis " < " si se termin cu o parantez unghiular nchisa " > ".

Tag-urile ntre aceste paranteze transmit comenzi ctre browser pentru a afia pagina ntr-un anumit mod. Unele blocuri prezint delimitator de sfrit de bloc, n timp ce pentru alte blocuri acest delimitator este opional sau chiar interzis.

Intre cele doua marcaje si vom introduce doua seciuni:

- seciunea de antet ...

- corpul documentului .... Blocul ... cuprinde coninutul propriu-zis al paginii HTML, adic ceea ce va fi afiat in fereastra browser-ului.

Fig. 1.4 Structura unui document html.

Aplicnd cele spuse mai sus vom ajunge la urmatorul rezultat:

Tagul conine, de obicei, elemente precum tagul - ce semnific titlul paginii, - pentru a face referire la fisiere javascript folosite pentru a da dinaminictate paginii, - folosit pentru a face referire la fisiere css ce contin informaii despre aspectul documentului.

In general, documentul va avea urmatoarea structura a elementelor coninute in tagul :

Titlul paginii

Tagul conine corpul documentului. Practic, in acest tag rezida toate elementele ce vor fi afiate direct ctre utilizator. Pentru a structtura o pagina web cat mai eficient se folosete tagul ce marcheaz o poriune din document ale crei mrimi pot fi setate fie din interiorul fiierului css sau aplicand atributele width si height acestui document.

Un exemplu practic de utilizare a tagului este crearea unui meniu de navigare. Folosind tagul ntregul meniu va fi privit ca o singura entitate. Aceasta este structura unui fisier HTML ce conine un meniu de navigare minimalist implementat prin intermediul tagului .

Titlul paginii

  • Sectiunea 1
  • Sectiunea 2
  • Sectiunea 3

Dup cum putei observa, am folosit tagul

  • ce marcheaza o lista neordonat pentru a introduce elementele meniului de navigare. Fiecare element din meniu de navigare este introdus prin intermediul tagului
  • ce marcheaza un element al unei liste.

    De asemenea, pentru a crea legaturi intre numele unei seciuni si pagina acestei sectiuni am folosit tagul ce marcheaza un link spre o pagin, pentru a preciza pagina acionat de link am folosit atributul href al acestui tag ce specific resursa indicat de link.

    II.4 CSS. Prezentare

    CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui document HTML. Stilurile se pot ataa elementelor HTML prin intermediul unor fiiere externe sau n cadrul documentului, prin elementul i/sau atributul style.

    Pentru a personaliza aspectul unui element dintr-un fisier HTML prin intermediu css este necesara o modalitate de a face referire la acele elemente din interiorul unui fisier css. De obicei, se folosesc atributede id si class ale unui tag html pentru a se face referire la el dintr-un fisier css.

    n exemplul urmtor modficm mrimea fontului unui paragraf si culoarea acestuia prin intermediul unui fisser css.#paragraf {

    font-size: 23px;

    font-color: blue;

    }Acesta este fiierul html asupra caruia aplicm stilul definit in interiorul fiierului css.

    Acesta este un paragraf.

    Este demn de precizat ca este nevoie sa precedem id-ul elementului cu un # atunci cand dorim sa facem referire la un element dupa id-ul acestuia.

    O alta caracteristic des folosita a fiierelor css este poziionarea unui element. Bazndu-ne pe acelai principiu expus n exemplul anterior putem poziiona un element dupa bunul plac folosind atributele left, right, botton si top.

    In exemplul urmtor vom poziiona o imagine la 200px de partea din stanga a paginii si 200px de partea din dreapta a paginii.

    .imagine {

    left: 200px;

    top: 200px;

    position: absolute;

    }

    Aceasta este structura fiierului html asupra cruia am aplicat stilurile definite in fisierul css expus mai sus.

    Dupa cu observati, de aceasta data am folosit atributul class al tagului pentru a face referire la acesta din interiorul fiierului css. De asemenea, se poate observa ca n interiorul fiierului css am prefixat clasa imaginii cu un punct, acesta fiind modul prin care selectam un element in funcie de valoarea atributului class.

    Dei nu foarte folosit n pactic, exista o a doua modalitate de a personaliza un fisier html prin intermediul css fara a face referire la resurse externe. Pentru aceasta va trebui sa utilizam tagul din interiorul tagului .

    Acesta este modul in care putem scrie exemplul prezentat anterior intr-un singur fisier:

    .imagine {

    left: 200px;

    top: 200px;

    position: absolute;

    }

    II.5 JavaScript. Prezentare

    II.5.1 Limbajul JavaScript

    JavaScript (JS) este un limbaj de programare orientat obiect bazat pe conceptul prototipurilor. Este folosit mai ales pentru introducerea unor funcionaliti n paginile web, codul Javascript din aceste pagini fiind rulat de ctre browser. Limbajul este binecunoscut pentru folosirea sa n construirea siturilor web, dar este folosit i pentru accesul la obiecte ncastrate (embedded objects) n alte aplicaii. A fost dezvoltat iniial de ctre Brendan Eich de la Netscape Communications Corporation sub numele de Mocha, apoi LiveScript, i denumit n final JavaScript.

    n ciuda numelui i a unor similariti n sintax, ntre JavaScript i limbajul Java nu exist nicio legtur. Ca i Java, JavaScript are o sintax apropiat de cea a limbajului C, dar are mai multe n comun cu limbajul Self dect cu Java.

    Codul scris in acest limbaj este introdus direct in interiorul fisierului HTML prin intermediul tagului sau se poate face referire la un fisier JavaScript prin intermediul atributului src al tagului . Prima variant este cea mai des ntalnit ntruct este ideala pentru scripturi de dimensiuni mici, ce nu depasesc 200-250 de linii de cod. n mod normal, aa va arata un fisier HTML ce conine si cod JavaScript:

    alert('alerta in javascript');

    n exemplul de mai sus am folosit funcia alert pentru a demonstra modul de funcionare a unui program simplu in JavaScript.Definirea variabilelor

    In JavaScript, precum si n alte limbaje de scripting, nu este necesar declararea tipului de date atunci cand definim o noua variabil sau funcie. Totui, definirea unei noi variabile se face folosindu-ne de cuvntul cheie var, nu puteam pur i simplu sa folosim acea variabila fara sa o fi declarat.

    Exemplu de definire a variabilelor in limbajul JavaScript:

    var a = 1;

    a = string cu doua ghilimele;

    a = 'string cu apostroafe';

    a = 2.3;

    n exemplul de mai sus am creat o variabila a i i-am am atribuit pe rand 4 valori de tip: intreg,

    string, string delimitat de apostroafe i numr real. Precum majoritatea limbajelor de scripting, JavaScript, pune la dispoziie dou modaliti sintactice de reprezentare a stringurilor: forma ce face uz de ghilimele i forma ce folosete apostroafele.

    Structuri decizionale n limbajul JavaScript

    Din punct de vedere al structurilor decizionale JavaScript se aseamn foarte mult cu limbajele C, C++ si Java. Exemplul urmator demostraza modul de folosire a celor mai frecvente structuri decizionale, i anume: if/else/elseif i switch.

    if(true) {

    alert('ramura de adevar');

    }

    else if(undefined) {

    alert('ramura elseif');

    }

    else {

    alert('ramura else');

    }

    switch(variabila) {

    case true:

    alert('cazul de adevar');

    break;

    default:

    alert('nicio ramura nu a fost acoperita');

    }

    n exemplul de mai sus am introdus o strucura decizional de tip if/elseif/else ce apeleaza funcia alert, pasndu-i ca i argumente stringurile: 'ramura de adevar', 'ramura elseif', 'ramura else', n funcie de ramura pe care se afla fluxul de execuie.

    n cazul celui de al doilea exemplu, n care folosim structura switch, vom apela funcia alert pasndu-i ca i argument stringul 'cazul de adevar', atunci cand fluxul de executie se afla in cazul in care valoarea variabilei variabila este true.

    Structuri repetitive

    Precum i in limbajul de programare C, limbajul JavaScript pune la dispozitie 3 structuri repetitive principale: do/while, while, for.

    n exemplul urmator voi prezenta fiecare din cele 3 structuri repetitive:

    do {

    alert(i);

    i++;

    } while(i < 10);

    while(i > 8) {

    alert(i);

    i--;

    }

    for(var i = 0; i < 20; i++) {

    alert(i);

    }

    Bucla do/while va rula pana cand valoarea varieabilei i va fi mai mare decat 10, la fiecare iteraie se afieaz valoarea variabilei i i se incrementeaz cu o unitate.

    Bucla while va rula pan cnd valoarea ei va fi mai mica de 8, la fiecare iteraie a buclei se va afia valoarea variabilei prin intermediul functiei alert, iar valoarea variabilei i va fi decrementat cu o unitate.Bucla for va rula pn cnd valoarea variabilei i va fi mai mare de 20, la fiecare iteraie a buclei valoarea variabilei va fi incrementata cu o unitate, iar valoarea acesteia va fi afiat ntr-o csua de dialog prin intermediul funciei alert.

    Definirea functiilor

    Limbajul JavaScript pune la dispoziie doua modaliti de definire a funciilor, prima asemnndu-se foarte mult cu modul de definire a funciilor din limbajul php. Exemplul urmtor ilustreaza modul de utilizare a celor doua modaliti.

    function f() {

    alert('f');

    }

    var g = function() {

    alert('g');

    }

    Prima modalitate definete o funcie f ce va afia o casu de dialog cu textul f atunci cand este apelat, iar a doua definete o variabila g caruia i este atribuit valoarea unei funcii anonime ce afieaz o casuta de dialog cu textul g.

    II.5.2 Prezentarea bibliotecii JQuery

    Pentru a prelucra elementele DOM-ului prin intermediul JavaScript simplu vom ntampina o serie de dificultati, ntrucat funciile folosite pentru realizarea acestor lucruri sunt implementate diferit de producatorii de browsere, iar API-ul nativ pus la dispozitie de un browser pentru efectuarea acestui lucru ofera o interfata neprietenoasa. Pentru a usura procesul de selectare si modificare a elementelor DOM-ului vom folosi o biblioteca denumita JQuery. Selectarea elementelor dupa id

    Pentru a modifica elementele unui document HTML este nevoie de o modalitate de a le accesa, interfata pus la dispoziie de JQuery se aseman foarte mult cu modul n care selectm elementele HTML din limbajul CSS. n exemplul urmator voi selecta tagul cu id-ul paragraf si voi adauga in interiorul acestuia textul text.

    $(document).ready(function() {

    $('#paragraf').append('text');

    });

    Se observa apelul la metoda ready a documentului, scopul acestei aciuni este de a executa cod JavaScript decat dupa ce browserul a terminat de incrcat pagina complet. Folosind metoda append aplicata asupra elementului cu id-ul paragraf vom adauga textul text n interiorul acestui element.Tratarea evenimentelor

    JQuery ne permite s legm diferite evenimente de elemente din fisierul HTML. Spre exemplu, atunci cnd se face click pe un buton va fi apelat evenimentul click. JQuery ne permite s executam poriuni de cod la executarea unui astfel de eveniment.

    In exemplul de mai jos voi afisa o casuta de dialog de fiecare data cand se face click pe un buton ce are atributul class egal cu buton.

    $('.buton').click(function() {

    alert('ati apasat butonul');

    });

    Buton

    II.6 Limbaje de scripting

    II.6.1 Python. Prezentare

    Python este un limbaj de programare dinamic multi-paradigm, creat n 1989 de programatorul olandez Guido van Rossum. Van Rossum este i n ziua de astzi un lider al comunitii de dezvoltatori de software care lucreaz la perfecionarea limbajul Python i implementarea de baz a acestuia, CPython, scris n C. Python este un limbaj multifuncional folosit de exemplu de ctre companii ca Google sau Yahoo pentru programarea aplicaiilor web, ns exist i o serie de aplicaii tiinifice sau de divertisment programate parial sau n ntregime n Python. Popularitatea n cretere, dar i puterea limbajului de programare Python au dus la adoptarea sa ca limbaj principal de dezvoltare de ctre programatori specializai i chiar i la predarea limbajului n unele medii universitare. Din aceleai motive, multe sisteme bazate pe Unix, inclusiv Linux, BSD i Mac OS X includ din start interpretatorul CPython.

    Python pune accentul pe curenia i simplitatea codului, iar sintaxa sa le permite dezvoltatorilor s exprime unele idei programatice ntr-o manier mai clar i mai concis dect n alte limbaje de programare ca C. n ceea ce privete paradigma de programare, Python poate servi ca limbaj pentru software de tipul object-oriented, dar permite i programarea imperativ, funcional sau procedural. Sistemul de tipizare este dinamic iar administrarea memoriei decurge automat prin intermediul unui serviciu gunoier (garbage collector). Alt avantaj al limbajului este existena unei ample biblioteci standard de metode.

    Implementarea de referin a Python este scris n C i poart deci numele de CPython. Aceast implementare este software liber i este administrat de fundaia Python Software Foundation.

    Tipizare

    Limbajele dinamice sunt deseori caracterizate prin tipizare dinamic, sunt interpretate, au management de memorie automatizat (garbage collecting) i au un nivel nalt de abstractizare. Tipul variabilelor nu este fixat la momentul declarrii acestora (de fapt, declararea variabilelor nu este necesar ca n C), ci este determinat de interpretator dup coninutul lor sau dup operaiile efectuate. ntr-un asemenea caz se vorbete de tipizare dinamic.

    Avantajul acestei metode de a lucra cu tipuri este c codul produs este mai clar i mai intuitiv. De exemplu a = 10 # a va fi consider un numr ntreg (integer)

    b = 11.5 # b va fi considerat un numr raional (double sau float)

    c = "un rnd de text" # c va fi considerat un ir (string)

    n ciuda tipizrii dinamice, Python este puternic tipizat, adic interpretatorul nu permite operaii cu obiecte de tip diferit dac acestea nu sunt bine definite, cum ar fi operaiile de tip cast n C. Exist totui unele excepii logice, cum ar fi n cazul numerelor ntregi i celor raionale (float), ntre care sunt permise operaii ca adunarea sau mprirea, tipul rezultatului innd cont de natura operaiei, cum se poate vedea mai jos

    d = 10 + 11.5 # rezultatul va fi un numr raional, 21.5

    e = "o brio" + 4 # aceast comand va genera o eroare.

    Alt concept important n Python este cel al tipurilor mutabile i nemutabile. Aa cum implic numele, datele cu un tip mutabil pot fi alterate dup iniializare, n vreme ce la date nemutabile lucrul acesta este imposibil. Lund ca exemplu o list (mutabil), constatm c putem aduga elemente la list sau le putem modifica fr probleme. n cazul unui ir de caractere (nemutabil), acest lucru nu este permis:

    lista_mea = ["mr", "par"]

    lista_mea.append("strugure") # adaug la list

    print lista_mea[2] # afiaz: strugure

    irul_meu = "varz"

    irul_meu[0] = "b" # schimb cuvntul n "barz" -> Eroare

    Structuri de date

    Python ofer tipuri tradiionale de date, cum ar fi numrul ntreg (integer, int) sau cel raional (float), dar introduce totodat i concepte noi.

    De exemplu, un grad mare de flexibilitate l ofer listele (tablourile) n Python. Acestea nu sunt statice, ci pot conine orice tipuri de date (n cadrul aceleiai liste) i pot fi modificate pe loc adugnd i eliminnd elemente fr a declara sau utiliza funcii de manipulare a memoriei.lista_mea = [10, "ir de caractere", variabil, ["alt", "list"], chiar_i_o_funcie]

    Alte structuri de date sunt tuplurile/perechile (tuples) i dicionarele (dictionaries, mappings). Tuplurile sunt liste care au un numr prestabilit de elemente, i nu pot fi modificate parial. Tuplurile pot fi utilizate n cazuri n care este nevoie de o anumit structur de date specializat, de exemplu coordonate n spaiul cartezian. Dicionarele sunt liste neordonate n care fiecare element are asociat o cheie, care poate fi numr sau ir de caractere. Dicionarele au foarte multe aplicaii, inclusiv crearea structurilor de tip hash-tables.

    Stil

    Python este un limbaj multi-paradigm, concentrndu-se asupra programrii imperative, orientate pe obiecte i funcionale, ceea ce permite o flexibilitate mai mare n scrierea aplicaiilor. Din punctul de vedere al sintaxei, Python are un numr de contrucii i cuvinte cheie cunoscute oricrui programator, dar prezint i un concept unic: nivelul de indentare are semnificaie sintactic. Blocurile de cod sunt delimitate prin simpl indentare.

    n C un astfel de blocuri sunt deseori desemnte prin acolade, {}, dar n Python nu este nevoie de astfel de construcii. Nivelele de indentare ndeplinesc aceast funcie. Aceast importan a indentrii este foarte suprinztoare pentru muli utilizatori noi ai limbajului Python, chiar dac sunt programatori cu experien. Dar o astfel de utilizare a indentrii permite codului s fie mai uor de citit i mai compact. Programatorii cu experien vor indenta implicit codul surs, oricare ar fi limbajul, fiindc astfel se permite structurarea codului surs i evidenierea funcionalitii. Python face din aceast deprindere folositoare n acest sens o cerin strict.

    O impunere similar exist i n limbajul de programare Java, care foreaz programatorii s delimiteze clasele n fiiere aparte, din motive de organizare i sporire a eficienei de scriere a softului n echipe.Biblioteci i Extindere

    Includerea tuturor acestor structuri, precum i a funciilor ce permit manipularea i prelucrarea lor, precum i multe alte biblioteci de funcii sunt prezente datorit conceptului Batteries Included, ce poate fi explicat prin faptul c Guido van Rossum i comunitatea ce s-a format n jurul limbajului cred c un limbaj de programare nu prezint utilitate practic dac nu are un set de biblioteci importante pentru majoritatea dezvoltatorilor.

    Din acest motiv Python include bibioteci pentru lucrul cu fiiere, arhive, fiiere XML i un set de biblioteci pentru lucrul cu reeaua i principalele protocoale de comunicare pe internet (HTTP, Telnet, FTP). Un numr mare de platforme Web sunt construite cu Python. Abilitile limbajului ca limbaj pentru programarea CGI sunt n afara oricror dubii. De exemplu YouTube, unul din site-urile cu cea mai ampl cantitate de trafic din lume, este construit pe baza limbajului Python.

    Totui, Python permite extinderea funcionalitii prin pachete adiionale programate de teri care sunt axate pe o anumit funcionalitate. De pild, pachetul wxPython conine metodele i structurile necesare crerii unei interfee grafice.

    Popularitatea limbajului este n cretere ncepnd cu anul 2000, datorit faptului c Python permite crearea mai rapid a aplicaiilor care nu cer viteze nalte de procesare a datelor. De asemenea este util ca limbaj de scriptare, utilizat n cadrul aplicaiilor scrise n alte limbaje. Modulele (bibliotecile) Python pot fi de asemenea scrise n C, compilate i importate n Python pentru a mri viteza de procesare.II.6.2 Frameworkul web Flask

    Spre deosebire de PHP, Python nu ofer suport direct pentru dezvoltarea aplicaiilor web, pentru a dezvolta aplicaii web in python este necesar un framework web ce va pune la dispozitie toate funciile i dependinele necesare dezvoltrii unei aplicaii web.

    Elementele de baza puse la dispozitie de Flask sunt: serverul web folosit pentru efectuarea testelor, template engine-ul si o bibliotec vasta de funcii uzuale n dezvoltarea unei aplicatii web.Structura unei aplicaii web dezvoltate folosind Flask

    Exemplul urmtor ilustreaza structura de baza a unei aplicaii scrise in flask:from flask import Flask

    from flask import render_templateapp = Flask(__name__)@app.route('/index')

    def index():

    return render_template('index.html')

    Dupa cum vedei, este necesar importarea clasei Flask i a funciei render_template. Variabila app va fi iniializat drep un obiect de tip Flask, acest obiect va conine toate datele ce in de configurarea aplicatiei.

    Functia render_template va procesa templateul al crui nume i este pasat ca i argument si va returna sub forma unui string coninutul acestuia. Motivul folosirii unei astfel de metode este pentru a permite utilizarea structurilor de control ce permit crearea templateurilor ntr-un mod dinamic.

    Folosind decoratorul app.route nregistram funcia index drept un view. Astfel, funcia index va fi apelat de fiecare dat cand un client solicit resursa /index.

    De asemenea, Flask permite si introducerea variabilelor n URL si selectarea metodei aferente unei rute. Exemplul urmator demonstreaza aceste lucruri:from flask import Flask

    from flask import render_template

    app = Flask(__name__)

    @app.route('/utilizator/', methods=['GET', 'POST'])

    def utilizator():

    return render_template('pagina_utilizator.html')

    Din exemplul prezentat mai sus putem observa ca ruta utilizator contine in URL o variabila de tip integer ce semnifica id-ul utilizatorului. De asemenea, puteam observa ca metodele aferente acestei rute sunt GET si POST. In mod standard, fiecare ruta permite accesul doar prin metoda GET, folosirea metodei post este necesara decat dac dorim sa procesm un formular.Prezentarea template engineului

    Pentru a procesa templateurile intr-un mod dinamic este necesar folosirea unui template engine ce implementeaza structuri de control de baza. Template engineul folosit de flask se numeste Jinja2 i pune la dispoziie majoritatea structurilor de control ntlnite n limbajul Python, asemnndu-se foarte mult si din punct de vedere sintactic.

    Exemplul urmtor ilustreaza un template ce genereaza in mod dinamic o list HTML iternd elementele dintr-o lista, pentru o mai buna ntelegere am inclus i codul responsabil cu servirea cererilor.

    from flask import Flask

    from flask import render_template

    app = Flask(__name__)

    @app.route('/lista')

    lista = [1, 2, 3]

    return render_template('lista.html', lista=lista)

    Acesta este templateul

    1. {% for element in lista %}

    2. {{ element }}

      {% endfor %}

    Dupa cum se poate observa stuctura for folosit n template engine se aseaman foarte mult cu cea folosit n limbajul Python. Demn de menionat este si faptul c strucurile de control sunt scrise n interiorul elementelor {% i %}, iar atunci cnd dorim sa accesm valoarea unui obiect vom scrie numele acestuia intre elementele {{ i }}.

    II.6.3 Administrarea bazelor de date cu SQLAlchemy

    SQLAlchemy este un ORM(Object Relational Mapper) ce permite efectuarea de interogri fara a mai scrie cod SQL. Folosind SQLAlchemy se va crea o relatie intre baza de date si modul in care sunt reprezentate atributele clasei ce mosteneste clasa pusa la dispozitie de SQLAlchemy.Crearea tabelelor n SQLAlchemy

    n SQLAlchemy tabelele sunt reprezentate de clase ce motenesc clasa db.Model.Astfel, la rularea scriptului ce se ocupa de crearea bazei de date, SQLAlchemy, va crea tabelele n funcie de clasele ce mostenesc clasa db.Model. Pentru a defini cmpurile unui tabel vom iniializa fiecare atribut al clasei ce motenete clasa db.Model cu instane ale clasei db.Column.Urmatorul exemplu ilustreaza conceptele explicate mai sus:class Utilizator(db.Model)

    id = db.Column(db.Integer, primary_key=True)

    nume = db.Column(db.String, nullable=False)

    prenume = db.Column(db.String, nullable=False)

    parola = db.Column(db.Srtring, nullable=False)

    def __init__(self, nume, prenume, parola):

    self.nume = nume

    self.prenume = prenume

    self.parola = parola

    Dup cum se poate vedea, definim o clasa denumita Utilizator ce motenete clasa db.Model. Clasa Utilizator contine urmatoarele atribute: id contine o instanta a clasei db.Column create pentru un cmp de tip ntreg ce este i cheie primar, nume ce contine o instan a clasei db.Column iniializat pentru un camp de tip string a crui valoare nu poate fi nul, prenume - ce conine o instana a clasei db.Column iniializat pentru un camp de tip string ce nu poate conine o valoare nul, parola conine o instan a clasei db.Column iniializat pentru un element de tip string ce nu poate conine o valoare nula.Un alt avanatj al SQLAlchemy este faptul c nu constrnge utilizatorul la folosirea unui anumit sistem de management al bazelor de date. In general, utilizatorii SQLAlchemy folosesc PostgreSQL.Executarea interogarilor

    Avand in vedere faptul ca clasele ce motenesc clasa db.Model sunt reprezentarile tabelelor din baza de date, acestea conin i metode speciale folosite pentru a efectua interogari.Exemplul urmtor demonstreaza cele mai frecvent utilizate meode pentru efectuarea unei interogri:utilizatori = Utilizator.query.all()

    george = Utilizator.query.filter_by(name='geroge').first()

    utilizatorul1 = Utilizator.query.get(1)n primul exemplu atribuim variabilei utilizatori o lista ce va conie toate obiectele de tip Utilizator din baza de date.

    n al doilea exemplu atribuim variabilei george ca i valoare obiectul returnat de efectuarea unei interogri dup cmpul nume.

    n al treilea exemplu atribuim vaiabilei utilizatorul1 valorea returnat de interogarea efectuata cu scopul de a obine elementul cu id-ul 1.

    Pentru a aduga informaii noi n baza de date va trebui sa adugam obiectul modificat sau nou creat in sesiunea pusa la dispozitie de SQLALchemy dupa ce am terminat de adaugat elementele noi sau modificate n sesiune va trebui sa confirmm schimbarea.

    Exemplul urmtor ilustreaza introducerea unui nou utilizator n baza de dateutilizator = Utilizator(nume='David', prenume='laurentiu', parola='123444')

    db.session.add(utilizator)

    db.session.commit()

    Apelul la metoda db.session.commit arat acordul nostru cu privire la introducerea noului utilizator adaugat n sesiune n baza de date.III. ARHITECTURA MAGAZINULUI WEB

    III.1 Prezentarea magazinului

    Magazinul web creat in cadrul lucrrii de licenta este unul ce se axeaza pe o gam cat mai larga de produse, oferind suport pentru o varietate de produse din diverse categorii. Pagina web este

    mprit in 3 zone: bara de navigare, zona de coninut si subsolul paginii.

    Bara de navigare prezentat in figura 3.1 cuprinde: numele magazinului online numele fiind un link la pagina de index, butonul de acas, butonul pentru pagina de contact, butonul ce afieaz meniul cu categoriile disponibile, casua de cutare i butoanele de ieire din cont i de interogare a cosului. Fig. 3.1 Bara de navigareZona de coninut difer n funcie de pagina pe care se afla utilizatorul. Spre exemplu, pe pagina de cos se vor afisa elementele aflate in cos, valoarea acestora si meoda de plata.Fig. 3.2 Coninutul paginii de coZona de subsol conine o bar de navigare ce cuprinde numele creatorului magazinului web

    Fig. 3.3 Coninutul subsolului

    In continuare, voi prezenta fiecare pagin din cadrul aplicaiei.

    Pagina de index, conine un carusel cu imagini ale celor mai noi 3 produse, iar mai jos conine informaii detaliate despre produse, fiecare imagine este un link catre pagina produsului.

    Fig. 3.4 Pagina de index

    Pagina de contact, contine un formular de contact n care utilizatorul i va introduce datele de contact si mesajul pe care dorete s-l transmit administratorului siteului. Dac formularul completat de utilizator a fost valid, utilizatorul va fi redirecionat pe o noua pagina in care ii este confirmat trimiterea cu succes a emailului, iar un email cu mesajul utilizatorului va fi expediat ctre administratori.

    Fig. 3.5 Formularul de contact

    Fig. 3.6 Trimiterea cu succes a unui mesaj

    Fig. 3.7 Recepionarea mesajului de catre administrator

    Pagina de prosduse, va conine, n functie de categoria de produse selectat, toate produsele disponibile in baza de date din acea categorie. Produsele vor fi afisate in panouri mici ce vor conine: preul, poza cu link spre pagina produsului i butonul de adugare n co.

    Odat ce un produs a fost adugat n co. o casu de dialog ce va confirma acest lucru va fi afiat.

    Fig. 3.8 Adugarea unui produs n co

    Pagina de cutare, va conine toate rezultatele cutrii efectuate prin intermediul csuei de cutare coninut n meniul de navigare. Rezultatele cautarii vor fi structurate astfel: poza produsului cu link la pagina produsului, descrierea prosului, preul acestuia si disponibilitatea produsului.

    Fig. 3.9 Cutarea unui produs

    Pagina de nregistrare, conine un formular cu datele pe care un utilizator trebuie sa le completeze pentru a efectua cumprturi de pe aceast platforma. Dupa completarea datelor, utilizatorului i se va trimite un email cu un cod de activare a contului, odata ce utilizatorul va accesa linkul trimis prin email contul acestuia va fi activat.

    Fig. 3.10 Pagina de nregistrare

    Fig. 3.11 Confirmarea trimiterii emailului ce conine codul de activare

    Fig.3.12 Codul de activare trimis prin email

    Fig. 3.13 Activarea cu succes a contului

    Pagina de autentificare, conine un formular cu 2 campuri: numele de utilizator si parola. Odata trimis acest formular, utilizatorul va fi autentificat i va putea sa efectueze cumparaturi de pe acest site.

    Fig. 3.14 Autentificarea unui utilizator

    Pagina de co, va conine toate produsele aflate n co la momentul accesrii paginii i va oferi utilizatorului posibilitatea s modifice cantitatea cumprat din acel produs, s tearg produsul, s vizualizeze n timp real costul acelui produs i costul ntregii tranzacii. Dup ce utilizatorul i-a setat cantitatea dorit dintr-un anumit produs i a selectat i metoda de cumprare, va trebui s introduc datele de transport, iar un email cu factura va fi trimis.

    Fig. 3.15 Pagina de coFig. 3.16 Introducerea datelor de transport

    Fig. 3.17 Structura emailului ce conine factura

    III.2 Strucura backendului aplicaiei

    Pe partea de server, aplicaia este mparit n 21 de rute menite sa deserveasca fiecare dintre paginile prezentate mai sus, att si apelurile efectuate prin AJAX pentru a nu mai fi necesar rencarcarea paginii.

    Demn de prezentat sunt urmatoarele rute:

    Ruta pentru pagina de index, trimite uilizatorului pagina de index pasnd funciei render_template i o lista cu cele mai noi 3 produse in baza de date.

    @app.route('/')

    @app.route('/index')

    def index():

    promotionalProducts = Product.query.paginate(1, 3, False)

    return render_template('index.html',

    promotionalProducts=promotionalProducts)Ruta pentru pagina de contact, i va returna utilizatorului pagina de contact dac acesta o acceseaz pentru prima dat sau dac formularul completat de acesta este unul invalid. Dac formularul completat de utilizator este unul valid, atunci se va realiza un apel la functia sendMail pentru a-i trimite un email cu mesajul utilizatorului administratorului siteului. Funcia sendMail este implementata in interiorul fiierului helper.py i este o interfa mult mai accesibil a extensiei flask-mail ce necesit o cantitate mult mai mare de cod pentru transmiterea unui mail. De asemenea, se poate observa ca funcia render_template este folosit pentru generarea templaterurilor pentru mailuri, astfel putem scrie intr-un fisier HTML ablonul pentru un email.

    @app.route('/contact', methods=['GET', 'POST'])

    def contact():

    form = ContactForm()

    if request.method == 'POST' and form.validate():

    sendMail(subject='Conact',

    sender=app.config['ADMINS'][0],

    recipients=app.config['ADMINS'],

    messageBody='-----',

    messageHtmlBody=render_template('contact_mail.html',

    email=form.email.data,

    name=form.name.data,

    message=form.message.data)

    )

    return render_template('message_send_successfully.html')

    return render_template('contact.html', form=form)Ruta pentru pagina de cutare, va returna templateul pentru pagina de cautare pasandu-i funciei render_template ca i argument o lista de produse ce se potrivesc cu elementul cautat de utilizator.

    @app.route('/search', methods=['POST'])

    def search():

    products = Product.query.all()

    productsToRender = []

    for product in products:

    if request.form["search"] in product.name:

    productsToRender.append(product)

    return render_template('search_page.html', products=productsToRender)Ruta pentru pagina de inregistrare va verifica validitatea formularului de nregistrare completat de catre utilizator i, n funcie de validitatea acestuia, va trimite un email cu codul de activare sau l va ateniona pe utilizator s recompleteze corespunztor formularul.

    @app.route('/singup', methods=['GET', 'POST'])

    def singup():

    form = SingupForm(request.form)

    if request.method == 'POST' and form.validate():

    newPendingUser = PendingUser(pendingId=str(uuid4()),

    name=form.name.data,

    username=form.username.data,

    password=md5(form.password.data).hexdigest(),

    email=form.email.data

    )

    db.session.add(newPendingUser)

    db.session.commit()

    mailUrl = generateUrl(

    route=url_for('validateUser',

    pendingUserId=newPendingUser.pendingId

    ),

    hostname=request.host

    )

    sendMail(subject="Validation Mail",

    sender=app.config['ADMINS'][0],

    recipients=[newPendingUser.email],

    messageBody=render_template("confirmation_mail_body.html",

    confirmationLink=mailUrl

    ),

    messageHtmlBody=render_template(

    "confirmation_mail_html_body.html",

    confirmationLink=mailUrl

    )

    )

    flash("User " + form.name.data + " was added")

    return render_template("before_finish_singup.html",

    email=form.email.data

    )

    flashErrors(form.errors, flash)

    return render_template('singup.html',

    form=form

    )

    Odat ce un utilizator a completat corect formularul de nscriere, acesta va fi adaugat intr-o baza de date temporar pana ce linkul ce activare va fi accesat si va fi mutat in baza de date primara. Ruta ce se ocupa de activarea conturilor va verifica validitatea codului de activare si il va muta pe noul utilizator in baza de date primara in cazul in care codul de activare a fost valid. n cazul n care codul de activare nu este valabil, utilizatorul va fi redirecionat spre o alt pagin n care i se va spune acest lucru.

    @app.route('/validate/')

    def validateUser(pendingUserId):

    pendingUser = PendingUser.query.filter_by(pendingId=pendingUserId).first()

    if pendingUser is None:

    return render_template("invalid_activation_link.html")

    user = User(name=pendingUser.name,

    email=pendingUser.email,

    password=pendingUser.password,

    username=pendingUser.username

    )

    db.session.add(user)

    db.session.delete(pendingUser)

    db.session.commit()

    return render_template("successfull_activation.html",

    username=user.username

    )

    Ruta pentru pagina de login, va verifica validitatea formularului de login i, n funcie de acest aspect, va decide daca utilizatorul va fi autentificat sau daca va fi redirecionat spre pagina de autentificare situaie n care se ajunge n momentul completrii incorecte a formularului de autentificare.

    @app.route('/login', methods=['GET', 'POST'])

    def login():

    form = LoginForm()

    if request.method == "POST" and form.validate():

    user = User.query.filter_by(username=form.username.data,

    password=md5(form.password.data).hexdigest()

    ).first()

    if not user is None:

    login_user(user)

    flash('Te-ai logat cu succes')

    return redirect(url_for('index'))

    else:

    flash("Numele de utilizator sau parola nu sunt corecte!")

    flashErrors(form.errors, flash)

    return render_template("login.html",

    form=form)

    Ruta pentru pagina de categorii, acesta rut va returna un template ce va conine toate produsele dintr-o categorie suportat de magazin.

    @app.route('/categories//')

    def categories(category, page):

    products = Product.query.filter_by(category=category).paginate(page,

    PRODUCTS_PER_PAGE, False

    )

    return render_template("products.html",

    products=products

    )

    Ruta pentru pagina produsului, aceasta rut va reurna un template ce va contine toate datele stocate in baza de date despre un anumit produs.

    @app.route('/product_page/')

    def productPage(productId=1):

    product = Product.query.get(productId)

    return render_template("product_page.html",

    product=product

    )

    Ruta pentru pagina de co, aceasta rut va returna un template ce conine toate produsele coninute n co, dar i toate metodele de transport stocate n baza de date.

    @app.route('/cart')

    def cart():

    form = AddressForm()

    return render_template("products_in_cart.html",

    cart=g.cart.getProductData(),

    form=form

    )

    Ruta de updatare a coului, este folosit pentru a adauga un produs nou n co atunci cnd apsm butonul de adugare n co. Aceast rut este folosit n apelurie AJAX pentru a nu mai fi necesar rencrcarea paginii atunci cand se va face click pe butonul de adaugare n co.

    @app.route('/update_cart', methods=['GET', 'POST'])

    def updateCart():

    g.cart.updateQuantity(int(request.form["id"]),

    int(request.form["quantity"])

    )

    session["cart"] = g.cart.items

    session.modified = True

    app.save_session(session, make_response("dummy"))

    product = Product.query.get(int(request.form["id"]))

    return jsonify(total=product.price *

    int(request.form["quantity"])

    )

    Ruta pentru verificare a disponibilitii unui produs, este folosit atunci cand utilizatorul updateaza cantitatea unui produs pentru a verifica daca cantitatea introdus de utilizator este n concordan cu valoarea stocului acelui produs.

    @app.route('/check_stock', methods=['GET', 'POST'])

    def checkStock():

    product = Product.query.get(int(request.form["id"]))

    return jsonify(stock=product.stock)

    Ruta responsabila cu calcularea valorii coului, este folosita pentru a spori securitatea i a evita eventualele atacuri informatice realizate de utilizatorii ru voitori. Este mult mai sigur sa calculm valoarea coului pe server dect s-i cerem browserului utilizatorului s o fac pentru noi.

    @app.route('/get_cart_total', methods=['GET', 'POST'])

    def getCartTotal():

    total=g.cart.getTotal()

    return jsonify(total=round(total, 2))

    Ruta pentru tergerea unui produs din co, folosit pentru a terge un produs din cos prin intermediul [email protected]('/delete_from_cart', methods=['POST'])

    def deleteFromCart():

    g.cart.deleteFromCart(int(request.form['id']))

    session["cart"] = g.cart.items

    return jsonify(status="ok")Ruta pentru setarea metodei de transport, folosit pentru a selecta firma dorita pentru a transporta produsul.

    @app.route('/set_shipping_method', methods=['POST'])

    def setShippingMethod():

    for shippingMethod in g.shippingMethods:

    if shippingMethod.name == request.form["name"]:

    g.cart.updateShipping(shippingMethod.price)

    session["shipping"]["price"] = g.cart.shipping

    session["shipping"]["name"] = request.form["name"]

    return jsonify(status="ok")

    return jsonify(status="fail")Ruta pentru obtinerea numelui firmei de transport, folosita pentru a menine valoarea firmei de transport aleas de utilizator de fiecare dat cnd acesta prsete pagina.

    @app.route('/get_shipping_method', methods=["POST"])

    def getShippingMethod():

    return jsonify(name=session["shipping"]["name"])

    Ruta pentru plasare a unei comenzi, va verifica validitatea datelor de livrare completate n formular de ctre utilizator, iar dac acestea sunt valide va trimite un email cu factura administratorului i unul clientului. n caz contrar il va avertiza pe utilizator de invaliditatea datelor introduse de el.

    @app.route('/place_order', methods=["POST"])

    def placeOrder():

    form = AddressForm(request.form)

    if form.errors:

    return jsonify(status='fail', errors=form.errors)

    for shippingMethod in g.shippingMethods:

    if shippingMethod.name == request.form["shipping"]:

    g.cart.updateShipping(shippingMethod.price)

    userData = UserData(phone=form.phone.data,

    email=form.email.data,

    region=form.region.data,

    city=form.city.data,

    address=form.address.data)

    userData.userId = g.user.id

    db.session.add(userData)

    db.session.commit()

    # The third argument was an architerchtural mistake.

    order = Order(g.cart.getTotal(), g.user.id, 1)

    order.address = userData.id

    db.session.add(order)

    db.session.commit()

    cart = []

    for item in g.cart.items:

    cart.append({

    'quantity': g.cart.items[item]['quantity'],

    'name': Product.query.get(item).name,

    'price': g.cart.items[item]['price']

    })

    sendMail(subject='Factura',

    sender=app.config['ADMINS'][0],

    recipients=[form.email.data, app.config['ADMINS'][0]],

    messageBody='----',

    messageHtmlBody=render_template('bill.html',

    cart=cart,

    name=g.user.name,

    total=g.cart.getTotal(),

    phone=form.phone.data,

    region=form.region.data,

    city=form.city.data,

    address=form.address.data,

    shipping=request.form['shipping'],

    shippingCost=ShippingMethods.query.filter_by(

    name=request.form['shipping']).first().price)

    )

    session["cart"] = {}

    return jsonify(status="ok")

    III.3 Structura bazei de date

    Aplicaia conine 11 clase ce motenesc clasa db.Model i au drept corespondent un tabel n baza de date.

    n continuare, voi prezenta structura celor mai importante din aceste 11 clase.

    Clasa utilizator, conine cmpuri pentru: nume, prenume, parol, email, dar i un cmp userData ce nu este direct reprezentat n baza de date, dar este specific SQLAlchemy. Scopul campului userData din cadrul clasei User este de a accesa datele din tabelul UserData fra a mai fi nevoie sa executm o interogare.

    class User(db.Model):

    __tablename__ = 'user_table'

    id = db.Column(db.Integer, primary_key=True)

    username = db.Column(db.String, nullable=False)

    name = db.Column(db.String, nullable=False)

    password = db.Column(db.String, nullable=False)

    email = db.Column(db.String, nullable=False)

    userData = db.relationship('UserData', backref='user', lazy='dynamic')

    def is_authenticated(self):

    return True

    def is_active(self):

    return True

    def is_anoymous(self):

    return False

    def get_id(self):

    return unicode(self.id)

    def __init__(self, username, name, password, email):

    self.username = username

    self.name = name

    self.password = password

    # An user should have a primary email address.

    self.email = email

    def __repr__(self):

    return "" % (self.username, self.name, self.password)Meodele is_authenticated, is_active, is_anonymous si get_id sunt folosite cu scopul de face clasa User compatibil cu extensia flask-mail.Clasa UserData, este folosit pentru a stoca date despre locaia n care se va expedia produsul unui utilizator. Motivul pentru care nu-l constrngem pe utilizator sa-i selecteze adresa de transmitere a coletului de la nceput este pentru ca aceasta poate efectua o comanda de pe o adresa diferita. Intre clasa User i clasa UserData este o relaie de tip one-to-many, ntrucat un utilizator poate avea mai multe adrese.

    class UserData(db.Model):

    __tablename__ = 'userdata_table'

    id = db.Column(db.Integer, primary_key=True)

    phone = db.Column(db.String)

    email = db.Column(db.String)

    region = db.Column(db.String)

    city = db.Column(db.String)

    address = db.Column(db.String)

    userId = db.Column(db.Integer, db.ForeignKey('user_table.id'))

    def __init__(self, phone=None, email=None, region=None, city=None,

    address=None):

    self.phone = phone

    self.email = email

    self.region = region

    self.city = city

    self.address = address

    def __repr__(self):

    return "" % (self.phone, self.email,

    self.region, self.city, self.address)

    Clasa PendingUser, este folosit pentru a stoca temporar un utilizator pn n momentul accesrii linkului de activare, moment n care utilizatorul va fi mutat n baza de date principal permanent. Motivul folosirii acestui sistem de activare prin email este pentru a evita crearea de conturi ce nu vor fi niciodat folosite.

    class PendingUser(db.Model):

    __tablename__ = 'pending_user_table'

    id = db.Column(db.Integer, primary_key=True)

    username = db.Column(db.String, nullable=False)

    name = db.Column(db.String, nullable=False)

    password = db.Column(db.String, nullable=False)

    email = db.Column(db.String, nullable=False)

    pendingId = db.Column(db.String, nullable=False, unique=True)

    registrationDate = db.Column(db.DateTime, nullable=False)

    def __init__(self, pendingId, username, name, password, email):

    self.username = username

    self.name = name

    self.password = password

    self.email = email

    self.pendingId = pendingId

    self.registrationDate = datetime.utcnow()

    Clasa Product, este folosita cu scopul de reprezenta in baza de date un produs. Campurile: comments, pictures i specifications nu vor fi reprezentate in baza de date. Scopul lor este s i elimine nevoia executrii unei noi interogri.

    class Product(db.Model):

    __tablename__ = 'product_table'

    id = db.Column(db.Integer, primary_key=True)

    category = db.Column(db.String, nullable=False)

    description = db.Column(db.String, nullable=False)

    name = db.Column(db.String, nullable=False)

    price = db.Column(db.Float, nullable=False)

    stock = db.Column(db.Integer, nullable=False)

    comments = db.relationship('ProductComment', backref='product',

    lazy='dynamic'

    )

    pictures = db.relationship('ProductPictures', backref='product',

    lazy='dynamic'

    )

    specifications = db.relationship('ProductSpecifications',

    backref='product',

    lazy='dynamic'

    )

    def __init__(self, name, price, stock):

    self.name = name

    self.price = price

    self.stock = stock

    def __repr__(self):

    return "" % (self.name, self.price, self.stock)

    Clasa ProductPictures, este folosit pentru a reprezenta o poza a unui produs. ntruct un produs poate avea mai multe poze se creaza o relatie de tip one-to-many intre aceste 2 clase.

    class ProductPictures(db.Model):

    __tablename__ = "product_pictures_table"

    id = db.Column(db.Integer, primary_key=True)

    link = db.Column(db.String, nullable=False)

    date = db.Column(db.DateTime, nullable=False)

    productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))

    def __init__(self, link, productId):

    self.link = link

    self.productId = productId

    self.date = datetime.utcnow()

    def __repr__(self):

    return "" % self.linkClasa ProductComment, este folosita pentru a reprezenta n baza de date un comentariu postat de un utilizator la adresa unui produs. Ca i in cazul anterior, se creaza o relatia one-to-many ntre clasele Product si ProductComment, ntruct un produs poate avea mai multe comentarii.

    class ProductComment(db.Model):

    __tablename__ = 'product_comments_table'

    id = db.Column(db.Integer, primary_key=True)

    comment = db.Column(db.String, nullable=False)

    userId = db.Column(db.Integer, db.ForeignKey('user_table.id'))

    productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))

    def __init__(self, comment, userId):

    self.comment = comment

    self.userId = userId

    def __repr__(self):

    return "" % self.comment

    Clasa ProductSpecifications, este folosit pentru a stoca o specificaie a unui produs. ntruct magazinul suporta diferite tipuri de produse nu se poate uniformiza ntr-un mod eficient modul n care sunt reprezentate specificaiile unui produs. Din acest motiv am ales s introduc o nou tebela ce va conine cte o specificaie, creandu-se, astfel, o relatie one-to-many ntre clasa Product i ProductSpecifications.class ProductSpecifications(db.Model):

    __tablename__ = 'product_specification_table'

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String, nullable=False)

    data = db.Column(db.String, nullable=False)

    productId = db.Column(db.Integer, db.ForeignKey('product_table.id'))

    def __init__(self, productId, name, data):

    self.productId = productId

    self.name = name

    self.data = data

    def __repr__(self):

    return "ProductSpecfication(%r)" % self.namePentru a aduga un nou produs n baza de date va trebui sa instaniem clasa Product i ProductPictures ntruct multe din funcionalitile aplicaiei nu vor funciona n lipsa unei poze. Odata creat o nou instan a clasei Product este necesar adugarea ei n baza de date. Instata clasei ProductPictures poate fi adaugat in baza de date dect dupa ce a fost adaugat cea a clasei Product ntrucat este necesar id-ul produsului, iar id-ul este generat dect atunci cand produsul este incrcat n baza de date.

    Urmtorul exemplu dovedete conceptele ilustrate mai sus:

    produs = Produs('cafea', 2.33, 23)

    produs.descriere = 'cafea'

    produs.category = 'cafea'

    db.session.add(produs)

    db.session.commit()

    poza = ProductPictures('http://i.imgur.com/poza', produs.id)

    db.session.add(poza)

    db.session.commit()

    IV. CONCLUZII

    Aceast lucrare a prezentat procesul de dezvoltare a unei aplicaii web de complexitate medie, dar i uneltele moderne folosite pentru ducerea la bun sfarit a unei astfel de aplicaii.Proiectul prezentat in acest document se difereniaz de celelalte din categoria sa prin folosirea unei noi tehnologii, relativ noi pe partea de server limbajul Python i biblioteca Flask. Avantajul acestei diferenieri fa de aplicatiile web clasice ce folosesc, de obicei, un limbaj precum Php este uurina n dezvoltare.

    Dezavantajele acestei opiuni sunt lipsa unor extensii ce ar putea s ajute programatorul n procesul de devoltare al unui magazin web a fost necesar s implementez aceast funcionalitate de la zero, dar am compensat printr-un grad mai mare de flexibilitate i faptul c este mult mai dificil gsirea unei companii de hosting cu un pre rezonabil care s suporte tehnologiile folosite n acest proiect. Dei numrul companiilor ce ofer hosting pentru aplicaii ce folosesc Python i Flask este sesizabil mai mic, se compenseaz prin serviciile ireproabile. Astfel, companii precum Heroku sau Microsoft(cu platforma Windows Azure) ofer servicii ideale pentru a gzdui aceast aplicaie.

    Flask este un framework web nou pe pia, fapt datorit caruia nu beneficiaza de mulimea de extensii pe care o are la dispoziie Django. Motivul pentru care am optat pentru Flask n dezvoltarea acestei aplicaii este flexibilitatea. Alegerea unui framework web precum Django ne-ar fi impus un mod strict de dezvoltare ce ar fi fcut imposibil implementarea anumitor funcionaliti.

    n momentul de fa, aplicaia pune la dispoziie, cel puin din punct de vedere al utilizatorului de rand, toate specificaiile necesare pentru a-i conferi utilizatorului o experien de utilizare decenta. O funcionalitate ce ar fi sporit comunicarea cu utilizatorul ar fi fost implementarea unui modul de chat, ce ne-ar fi permis s discutm n timp real cu clienii notri. Din punct de vedere al administratorului magazinului, integrarea unui modul de adaugare a produselor ar fi uurat procesul, totui diferena ar fi fost isesizabil. n momentul de fa, produsele se pot adauga prin intermediul liniei de comand sau prin intermediul unui sistem de management al bazelor de date.

    O funcionalitate pe care dorim s o adaugm pe viitor este un sistem de validare a comenzilor i a nregistrrii utilizatorilor prin SMS - acest lucru ar duce la sporirea gradului de securitate.

    V. BIBLIOGRAFIE

    1. Python Cookbook, Brian K. Jones (2013), O'Reilly Media

    2. Flask Web Development, Miguel Grinberg, (2014), O'Reilly Media

    3. Head First HTML with CSS & XHTML, Eric Freeman, (2005), O'Reilly Media

    4. Bootstrap, Jake Spurlock, (2013), O'Reilly Media

    5. Essential SQLAlchemy , Rick Copeland, (2008), O'Reilly Media

    6. PostgreSQL: Up and Running, Leo S, Hsu, (2012), O'Reilly Media

    7. Functional JavaScript, Michael Fogus, (2013), O'Reilly Media

    8. jQuery Cookbook, Cody Lindley, (2009), O'Reilly Media

    9. Head First jQuery, Ronan Cranley, (2011), O'Reilly Media

    10. Ajax: The Definitive Guide, Anthony T. (2011), O'Reilly Media