33
Getting bigger with Flask Josip Katalinić

Getting bigger with flask

Embed Size (px)

Citation preview

Page 1: Getting bigger with flask

Getting bigger with Flask

Josip Katalinić

Page 2: Getting bigger with flask

•Početak u version 0.9•Python 4 godine•Flask 2 godine

Page 3: Getting bigger with flask

Flask

Microframework za Python koji je baziran na Werkzeug, Jinja2, te dobrim namjerama.

Page 4: Getting bigger with flask

Framework je uistinu toliko mali da

sveukupni izvorni kod za verziju 0.10.1. ima

svega 1,21 megabajta.

No opet to ga ne čini malim, dovoljno je samo primijetiti da Disqus sa svojim 50 miliona

korisnika koristi Flask koji je tek napunio 3 godine.

Page 5: Getting bigger with flask

Problemi!!!??

Page 6: Getting bigger with flask

import cgi

Page 7: Getting bigger with flask

Flask nema nativnu podršku za pristup

bazama, validaciju web formi, autentikaciju

korisnika ili neki drugi zadatak više razine.

Page 8: Getting bigger with flask

‘’Out of Box’’ Flask može request, response,

templates iurl routing.

Page 9: Getting bigger with flask

Osnovna struktura projekta

Sve Flask aplikacije moraju kreirati instancu aplikacije. Web server propušta sve zahtjeve koje

dobiva od klijenta prema ovom objektu za rukovanje, koristeći WSGI.

Page 10: Getting bigger with flask

Instanca aplikacije se kreira kao:

from flask import Flask app = Flask(__name__)

Page 11: Getting bigger with flask

@app.route('/')def pocenta():

return

'<h1>Test</h1>'

Definiranja putanje URL-a kroz app.route

dekorator:

Page 12: Getting bigger with flask

Flask također podržava dinamičko kreiranje

komponenti URL-a, tako na primjer dinamička putanja

imena se može kreirati kao:

@app.route('/korisnik/<ime>') def korisnik(ime):

return '<h1>Pozdrav, '\ ' %s!</h1>' % ime

Page 13: Getting bigger with flask

Instanca aplikacije ima run metodu koja pokreće integrirani razvojni

web server unutar Flask-a:

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

Page 14: Getting bigger with flask
Page 15: Getting bigger with flask

Struktura velikih aplikacija

Strukturiranje web aplikacije unutar jedne velike skripte, JE LOŠE NEOVISNO O VELIČINI

PROJEKTA. Takve aplikacije se ne skaliraju dobro, rastom aplikacije, jedan veliki source datoteka

postaje problem.

Page 16: Getting bigger with flask

Struktura projekta|-Testiranje |-app/ |-templates/ |-static/ |-__init__.py |-models.py |-main/ ----------------- |-__init__.py|-migrations/ |-errors.py|-requirements.txt |-forms.py|-config.py |-views.py|-manage.py

Page 17: Getting bigger with flask

Konfiguracijske opcije (config.py)

Potreba za raznim konfiguracijama (razvoj, testiranje,produkcija)

import osbasedir =

os.path.abspath(os.path.dirname(__file__))class Config: SECRET_KEY = 'Much secret So hard' SQLALCHEMY_COMMIT_ON_TEARDOWN = True

Page 18: Getting bigger with flask

class TestingConfig(Config):

TESTING = True

SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \

'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')

class DevelopmentConfig(Config):

DEBUG = True

SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \

'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')

config = {

'development': DevelopmentConfig,

'testing': TestingConfig,

'default': DevelopmentConfig

}

Page 19: Getting bigger with flask

Cilj nam je izbjeći kreiranje aplikacije unutar global scope.

Page 20: Getting bigger with flask

Ukoliko je aplikacija kreirana u global scope, odnosno za vrijeme pokretanja skripte, instance

aplikacije su već kreirane, te je prekasno za primjenu jedne od definiranih konfiguracija.

Page 21: Getting bigger with flask

Rješenje?

Page 22: Getting bigger with flask

Aplication Factory

Rješenje problema je odgoda kreiranja aplikacije tako što ju

stavljamo u factory function koja se može izravno pozvati iz skripe.

Page 23: Getting bigger with flask

Aplication Factory

Ovo rješenje daje skripti vremena da namjesti

konfiguraciju.

Page 24: Getting bigger with flask

Application Factory(app/__init__.py)

from flask import Flaskfrom flask.ext.bootstrap import Bootstrapfrom flask.ext.sqlalchemy import SQLAlchemyfrom config import config

bootstrap = Bootstrap()db = SQLAlchemy()

def create_app(config_name): app = Flask(__name__) app.config.from_object(config[config_name]) config[config_name].init_app(app)

bootstrap.init_app(app) db.init_app(app)

return app

Page 25: Getting bigger with flask

Implementiranje funkcionalnosti aplikacije kroz Blueprint

Putanje URL-ova asocirane sa blueprint su u stanje čekanja dok

se blueprint ne registira sa aplikacijom, te u tom trenutku

postaju dio nje.

Page 26: Getting bigger with flask

Kreiranje blueprinta(app/main/__init__.py)

from flask import Blueprintmain = Blueprint('main', __name__)from . import views, errors

Page 27: Getting bigger with flask

Registriranje kreiranog blueprinta

(app/__init__.py)

def create_app(config_name): # ... from main import main as main_blueprint app.register_blueprint(main_blueprint) return app

Page 28: Getting bigger with flask

Blueprint za error(app/main/error.py)

from flask import render_templatefrom . import main

@main.app_errorhandler(404)def page_not_found(e): return render_template('404.html'), 404

Page 29: Getting bigger with flask

Putanje URL-ova aplikacije koje su ažurirane da budu u blueprintu

(app/main/view.py)

from flask import url_for from . import main

@main.route('/')def pocenta(): return url_for(‘.pocetna')# …

Page 30: Getting bigger with flask

Pokretanje skripte(manage.py)

import osfrom app import create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

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

Page 31: Getting bigger with flask

Requirements File

(venv) $ pip freeze >requirements.txt

Flask==0.10.1Flask-Bootstrap==3.0.3.1Flask-Migrate==1.1.0Flask-Moment==0.2.0Flask-SQLAlchemy==1.0

Page 32: Getting bigger with flask

Izgradnja replike virutalnog okružja

(venv) $ pip install -r requirements.txt

Page 33: Getting bigger with flask

Kraj