Flask framework

Pierwsza aplikacja webowa

8 grudnia 2015 21:00
Patryk Szymański
python development flask framework

Pierwsza applikacja webowa - Framework Flask

Dzięki frameworkom webowym możliwości pythona wykraczają daleko poza to co dotychczas razem poznaliśmy. Dzisiaj skupimy się na microframeworku Flask.

Czym jest Flask?

  • Microframework,
  • idealny do budowania małych aplikacji
  • łatwy w konfiguracji,
  • modularny, posiada wiele rozszerzeń
  • prosty w obsłudze

Konfiguracja środowiska programistycznego

By zobaczyć naszą aplikację użyjemy przeglądarki internetowej w terminalu. Instaluje się ją poleceniem:

sudo apt-get install lynx

Następnie należy otworzyć nowe okno putty oraz zalogować się.

By oddzielić projekt we flasku od reszty systemu potrzebujemy osobnej instancji pythona. Tworzymy ją poleceniem:

mkvirtualenv NAZWA

Póżniej poleceniem deactivate możemy wyłączyć naszego virtualenva a poleceniem workon NAZWA aktywujemy wybranego virtualenva.

W stworzonym wcześniej virtualenvie musimy zainstalować flaska. By tego dokonać w konsoli wpisujemy

$ pip install flask

Następnie tworzymy folder z nazwą projektu oraz przechodzimy do niego:

mkdir NAZWA
cd NAZWA

W folderze projektu tworzymy plik hello.py w którym znajdzie się nasza pierwsza aplikacja we flasku.

Pierwsza aplikacja

Wykorzystamy wcześniej stworzony plik hello.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello World!</h1>'


@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, {}!</h1>'.format(name)


if __name__ == '__main__':
    app.run(debug=True)

Startujemy aplikacje

By uruchomić naszą pierwszą aplikację webową w konsoli wpisz:

$ python hello.py

Strona znajduje się pod adresem: http://127.0.0.1:5000/ By ją otworzyć w drugim oknie putty które otworzyliśmy na początku zajęć wpiszcie:

lynx 127.0.0.1:5000

Routing

Dekorator @app.route

Dekorator @app.route wykorzystywany jest do określenia ścieżek dostępu dla naszej aplikacji, np. @app.route('/index.html') dałoby nam ścieżkę www.example.com/index.html

Sterowanie ścieżkami (url i zmienne)

Statyczne url jak np. www.example.com/twoja/podstrona to nie wszystko co można stworzyć we flasku. Ten framework oferuje bardziej zaawansowany system zarządzania ścieżkami. Aby stworzyć ścieżkę zawierającą w sobie ZMIENNĄ używamy specjalnych znaczników <> np. @app.route('/hello/<twoje_imie>'). W przykładzie, twoje_imie będzie zmienną i zależnie od jej wartości możemy wykonywać różne akcje, np zwrócić wynik: Hello {}'.format(twoje_imie).

Niestety w obecnej formie, zmienna twoje_imie jest zmienną ogólną, może znaleźć się w niej cokolwiek, np. liczba, co w tym przypadku jest niepożądane. Aby ustawić zmienną na konkretny typ musimy jej nazwe poprzedzić ciągiem znaków oznaczającym jej typ oraz znakiem ':', np. app.route('/hello/<string:twoje_imie>').

Poza typem string istnieją jeszcze inne typy: int, dla liczb całkowitych, float, dla zmiennoprzecinkowych, path akceptujące slashe.

Renderowanie template'u:

Funkcja render_template renderuje plik HTML przekazany w parametrze, dodając wszystkie zmienne jako **kwargs do późniejszego wykorzystania w Jinjy wykorzystania w Jinjy (będzie wytłumaczone w dalszej części artykułu:-))

Flask Extensions

Flask extensions to dodatkowe paczki rozwijające możliwości Flaska na wiele różnych sposobów. np.:

  • Obsługujące różne typy baz danych
  • Panele admina
  • Ułatwiające tworzenie modułów logowania
  • Gotowe systemy autoryzacji
  • Dodające narzędzia do debugowania

Flask-script co to jest i dlaczego jest przydatne?

Pierwszą paczką jaką dzisiaj poznamy jest Flask-script. Flask-scirpt daje wsparcie dla zewnętrzych skryptów w Flasku. Obejmuje to uruchomienie serwera deweloperskiego, skrypty, aby skonfigurować bazę danych, cronjobs oraz wiele innych zadań, które nie są częścią samej aplikacji. Dzisiaj skupimy się na możliwości postawienia serwera deweloperskiego.

Instalacja

W konsoli wpisz:

$ pip install flask-script

Wykorzystanie w aplikacji

Najpierw musimy zaimportować moduł Manager na górze pliku hello.py

from flask.ext.script import Manager

Dalej w hello.py pod linią app = Flask(__name__) musimy dopisać:

manager = Manager(app)

Na koniec usuwamy app.run(debug=True) i dodajemy zamiast niego:

manager.run()

Po tym startujemy aplikacje poleceniem:

python hello.py runserver

Jinja2 czyli front-end naszej aplikacji.

Jinja2 jest to system szablonów HTML dla pythona. Pozwala na rozwinięcie standardowego szablonu HTML o wsparcie dla zmiennych podanych z back-endu, pętle for, instrukcje sterujące if itp.

Składnia

Blok {% ... %} wykorzystujemy przy pętlach for, instrukcjach if oraz innych specjalnych znaczników.

Blok {{ ... }} wykorzystujemy przy zmiennych które mają zostać pokazane użytkownikowi.

Zmienne w HTML.

Zmienne przekazywane są z back-endu pythonowego.

Przykład:

# Dopisujemy do pierwszej linii import render_template
from flask import Flask, render_template

@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)

Plik user.html:

Hello {{ name }}!

Wejście na adres localhost:5000/user/test/ w przeglądarce powinno zwrócić Hello test!

Instrukcja sterująca if

Tak samo jak w pythonie pozwala na sterowanie zachowaniami.

Przykład:

Hello {% if name %} {{name}}! {% else %} stranger! {% endif %}

Pętla for

Działa podobnie do pythonowej

Przykład:

{% for item in navigation %}
    <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}

Extends!

Jedną z najciekawszych funkcji Jinja2 jest wyrażenie extends. Pozwala ono na dziedziczenie HTML-u między szablonami. Na przykład w base.html może znajdować się nawigacja, stopka strony oraz linki do plików css i js. Dzięki czemu inne szablony dziedziczące z base.html nie będą musiały powielać tego kodu.

<!-- Przykładowy plik base.html -->
<!-- Może zawierać np. nawigację, stopkę itp. -->
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-collapse collapse">
            <ul class="nav navbar-nav">
                <li><a href="/">Home</a></li>
            </ul>
        </div>
    </div>
</div>

Plik index.html:

{% extends "base.html" %}
<!-- Dalsza część kodu -->

Block

Wyrażenie block pozwala na nadpisywanie bloku jednego szablonu w drugim.

Przykład:

Plik index.html:

{% extends "base.html" %}

{% block content %} 
    Teraz jesteśmy w bloku kontent pliku index.html
{% endblock %}

Plik browse.html

{% extends "index.html" %}

{% block content %} 
    W tym momencie nadpisujemy wszystko to, co znajdowało
    się w bloku content w pliku index.html.
{% endblock %}

Wykorzystanie w projekcie.

Zaimplementujmy jinje2 w naszym hello.py. Po pierwsze importujemy render_template:

from flask import Flask, render_template

Następnie w funkcji index() podmieniamy

return '<h1>Hello World!</h1>'

Na:

return render_template('index.html')

Natomiast w funkcji user() podmieniamy

return '<h1>Hello, {}!</h1>'.format(name)

Na:

return render_template('user.html', name=name)

Dokumentacja

Po więcej informacji o flasku kierujcie się na niżej podane strony: Flask Flask-script Jinja2

Comments