Programowanie w Internecie: #6 Małe frameworki webowe

9
#6: Małe frameworki webowe Mikołaj Olszewski Jakieś pytania po lekturze? Podsumowanie tematów Stos TCP/IP i gniazda sieciowe Protokoły sieciowe, poprawna komunikacja Webowe API i konsumpcja danych z sieci Aplikacje serwerowe i ich wydajność Dynamiczne aplikacja z niskopoziomowym API (CGI i WSGI) Podstawa dla kolejnych tematów Od serwera webowego do aplikacji CGI i WSGI — w górę stosu Stos webowy Poziomy stosu webowego Montaż gniazda sieciowe

description

Wprowadzenie do małych frameworków webowych na przykładzie Flaska.

Transcript of Programowanie w Internecie: #6 Małe frameworki webowe

  • #6: Mae frameworki weboweMikoaj Olszewski

    Jakie pytania po lekturze?

    Podsumowanie tematw

    Stos TCP/IP i gniazda siecioweProtokoy sieciowe, poprawna komunikacjaWebowe API i konsumpcja danych z sieciAplikacje serwerowe i ich wydajnoDynamiczne aplikacja z niskopoziomowym API (CGI i WSGI)

    Podstawa dla kolejnych tematwOd serwera webowego do aplikacji CGI i WSGI w gr stosu

    Stos webowy

    Poziomy stosu webowegoMonta

    gniazda sieciowe

  • protokoyWSGI / CGI

    Narzdzia

    cgitbwarstwy porednie WSGIWebOB, werkzeug tools

    Mae frameworki

    FlaskBottleCherryPyWeb.py

    Pene frameworki

    DjangoPyramidweb2py

    Systemy

    PloneDjango CMS

    FrameworkiZ wikipedii:

    Framework aplikacji webowej jest frameworkiem oprogramowania majcym na celuwsparcie tworzenia dynamicznych stron, aplikacji i serwisw webowych. Frameworkma za zadanie zmniejszy obcienie zwizane z typowymi czynnociamiwykonywanymi przy budowie aplikacji webowych. Na przykad wiele frameworkwdostarcza biblioteki do komunikacji z baz danych, korzystania z szablonw izarzdzania sesj uytkownika oraz czsto promuj reuywalno kodu.

    Co to wszystko znaczy?

    Framework suy do budowy aplikacjiFramework pozwala na budow aplikacji rnego typuFramework wprowadza pewn warstw abstrakcji i pozwala zaj si koniecznymi konkretami

    Co do tej pory byo zbdnym narzutem?

    Poziomy abstrackcji

    Abstrakcja 1 / wolno

  • Im wicej robi, tym mniejsze masz pole manewruKady framework wybiera jak funkcjonalno realizuje i udostpniaKady framework dokonuje innych wyborw

    Wane przy wyborze frameworka

    Webowe frameworki pythonoweDjango Grok Pylons TurboGears web2pyZope CubicWeb Enamel Gizmo(QP) GlashammerKarrigell Nagare notmm Porcupine QPSkunkWeb Spyce Tipfy Tornado WebCoreweb.py Webware Werkzeug WHIFF XPRESSAppWsgi Bobo Botle CherryPy circuits.webPaste PyWebLib WebStack Albatross AquariumDivmod Nevow Flask JOTWeb2 Python ServletEngine Pyramid Quixote Spiked weblayer

    Wybr frameworkaWiele osb mwi jest najelpszym frameworkiemW wikszoci wypadkw to znaczy Wiem jak uy W niektrych przypadkach naprawd znaczy to najlepiej pasuje do mojego mzgu

    Kady mzg (i kady przypadek) jest inny!

    Jak wybra?

    Pierwsze prawo wyboru

    Wybierz odpowiednie narzdzie do zadania

    Odpowiednie narzdzie to takie, ktre pozwoli skoczy zadanie szybko i poprawnieJak znale odpowiednie narzdzie?

    Drugie prawo wyboru

    Nie dowiesz si pki nie sprbujesz

    Flask

  • Pierwsze kroki

    Przygotowanie rodowiska

    $$ virtualenv flaskenv

    $$ source flaskenv/bin/activate

    (flaskenv)$$ pip install flask

    Prosta aplikacja

    intro.py

    Uruchomienie aplikacji

    (flaskenv)$$ python intro.py

    http://localhost:5000

    Debugowanie bdw

    error.py

    Uruchomienie na serwerze~/intro.wsgi

    import sys

    # doczenie do cieki wyszukiwania moduw# katalogu, w ktrym znajduje si aplikacja# najlepiej poza ~/wwwsys.path.insert(0, '/path/to/application/dir')

    # aktywacja rodowiska wirtualnegoactivate_this = '/path/to/flaskenv/bin/activate_this.py'execfile(activate_this, dict(__file__=activate_this))

    from intro import app as application

  • Konfigurowalno uWSGI

    ~/intro.ini

    [uwsgi]socket = /tmp/.wsgi.sockchmod-socket = 666plugin = pythonvirtualenv = /path/to/flaskenvchdir = /path/to/application/dirmodule = intro:app

    uwsgi intro.inihttp:///~/wsgi

    Co si dzieje?Klasa Flask reprezentuje pojedyncz aplikacj w rozumieniu WSGIInicjalizacja klasy nazw pakietu lub moduu (zazwyczaj __name__)

    flask uywa tego do poprawnej lokalizacji zasobw (pliki statyczne, szablony, dodatkowe moduydo importu)

    Definicja funkcji z dekoratorami oznaczajcymi ciek dostpu (URL), ktra je wywouje

    Routing URLDekorator routeMapowanie URL na punkt dostpowy (endpoint) / funkcjdanie pod dany URL wywouje zmapowan funkcjDynamiczne cieki

    symbol zastpczy argument funkcji, np. /profile/konwertery zapewnienie poprawnoci typu, np. /div/

    Filtrowanie po metodzie HTTPnp. @app.route('/blog/entry//', methods=['POST'])

    routes.py

    Odwracanie cieekTworzenie URL-i dla danego punktu dostpowego

    nie trzeba hard-kodowa URL-i przy budowaniu odnonikwmoliwo zmiany URL-i bez zmiany kodu decoupling

    Funkcja url_forwymaga kontekstu HTTP, ktry moe by imitowany

    import routes

  • from routes import appfrom flask import url_forwith app.test_request_context(): print url_for('show_profile', username="adam") print url_for('divide', val=23.7)

    '/profile/adam''/div/23.7/'

    Generowanie HTML-aBudowanie za pomoc stringwWykorzystanie systemu szablonw

    cay kod z miejscami do podmiany i powielenia w osobnym plikutyle szablonw ile frameworkwkady ma swoje zalety i wadyFlask zawiera system Jinja2

    Podstawy Jinja2

    Wypisanie zmiennych: {{ zmienna }}Dostp do elementu zmiennej

    {{ zmienna[atrybut] }}{{ zmienna.atrybut }}

    Wbudowane filtry: {{ zmienna|filtr }}Logika w znacznikach procesora: {% ... %}

    np. {% for x in y %}{{ x }}{% endfor %}kady blok logiki musi mie swj pocztek i koniec

    Dziedziczenie szablonwdefinicja rodzica, np. {% extends "layout.html" %}nadpisywanie blokw, np. {% block foo %}...{% endblock %}

    Wicej informacji

    Szablony we FlaskuFunkcja render_templatetemplates.pyFlask poszukuje szablonw w katalogu templates w tej samej lokalizacji, co modu aplikacji ( app = Flask(__name__))Wszelkie dodatkowe zmienne musz by przekazane argumenty jako sownikowe do funkcji renderujcej

    Kontekst

  • config obiekt konfiguracyjny, session obiekt sesjirequest obiekt dania, g globalny obiekt w obrbie daniaget_flashed_messages funkcja zwracajce krtkie informacjeurl_for funkcja do odwracania URL-i

    Trwao danychPaskie plikiBazy relacyjne (Postgres, MySQL, SQLServer)Skadnice obiektw (Pickle, ZODB)Bazy NoSQL (CouchDB, MongoDB)

    Mae frameworki pozostawiaj t kwesti otwart

    PrzykadProsty serwis mikroblogowyNa podstawie tutoriala na stronie FlaskaKod na BitBuckecie

    Krok 1: Prosta baza SQL

    PEP 249 DB APIImplementacja dla sqlite w bibliotece standardowejschema.sqlKonfiguracja i inicjalizacja w microblog.py

    Krok 1: Testy!

    Szalenie istotneNieoficjalny standardModu unittestmicroblog_test.py

    Krok 2: Zarzdzanie poczeniami

    Poczenie z baz powinno by otwarte jedynie na czas obsugi daniaDekoratory we Flasku:

    @before_request@after_request@teardown_request

    microblog.py

  • Krok 2: Zapis i odczyt wpisw

    Test moliwoci dodania wpisu do bazy w microblog_test.pyFunkcja write_entry w microblog.pyTest odczytu wszystkich wpisw

    dla pustej bazy w microblog_test.pydla baz z wpisami w microblog_test.py

    Funkcja get_all_entries w microblog.py

    Krok 3: Widoki

    Test odpowiedzi strony gwnejprzy braku wpisw w microblog_test.pyze znanym wpisem w microblog_test.py

    layout.htmlshow_entries.htmlWidok dla strony gwnej w microblog.py

    Krok 4: Autentykacja

    Testy logowaniadedykowanej funkcji

    poprawnie w microblog_test.pybdnie w microblog_test.py

    caego procesu w oparciu o widoki w microblog_test.pylogin.htmlWidoki

    dla logowania w microblog.pydla wylogowania w microblog.py

    Modyfikacja layout.html

    Krok 4: Dodawanie wpisu

    Test dodawania wpisu w microblog_test.pyWidok dla uytkownika microblog.pyModyfikacja show_entries.html

    Krok 5: Upikszanie

    style.cssModyfikacja layout.htmlZasoby statyczne (css, js, img) powinny by w katalogu static przy module aplikacji

  • Dalszy rozwj

    Lepszy wygldOgraniczenie liczby wywietlanych wpisw na stronie gwnejDodanie sygnatury czasowej do wpiswMoliwo edycji dotychczasowych wpisw (wraz z dodaniem statusu aktualizacji)...Twitter ;)

    PodsumowanieFrameworki uatwiaj prac

    wsparcie dla mudnych i powtarzalnych czynnociskupienie si na specyfice aplikacji

    Nie istnieje idealny framework, kady musi wybra najlepszy dla siebiePrzykad Flaska jako maego frameworka wspierajcego MVC

    #6: Mae frameworki weboweMikoaj OlszewskiJakie pytania po lekturze?Podsumowanie tematw

    Stos webowyPoziomy stosu webowegoMontaNarzdziaMae frameworkiPene frameworkiSystemy

    FrameworkiCo to wszystko znaczy?Poziomy abstrackcjiWebowe frameworki pythonoweWybr frameworkaJak wybra?Pierwsze prawo wyboruDrugie prawo wyboru

    FlaskPierwsze krokiPrzygotowanie rodowiskaProsta aplikacjaUruchomienie aplikacjiDebugowanie bdw

    Uruchomienie na serwerzeKonfigurowalno uWSGI

    Co si dzieje?Routing URLOdwracanie cieekGenerowanie HTML-aPodstawy Jinja2

    Szablony we FlaskuKontekst

    Trwao danychPrzykadKrok 1: Prosta baza SQLKrok 1: Testy!Krok 2: Zarzdzanie poczeniamiKrok 2: Zapis i odczyt wpiswKrok 3: WidokiKrok 4: AutentykacjaKrok 4: Dodawanie wpisuKrok 5: UpikszanieDalszy rozwj

    Podsumowanie