Getting bigger with flask

Post on 18-Jun-2015

234 views 2 download

Tags:

Transcript of Getting bigger with flask

Getting bigger with Flask

Josip Katalinić

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

Flask

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

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.

Problemi!!!??

import cgi

Flask nema nativnu podršku za pristup

bazama, validaciju web formi, autentikaciju

korisnika ili neki drugi zadatak više razine.

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

templates iurl routing.

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.

Instanca aplikacije se kreira kao:

from flask import Flask app = Flask(__name__)

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

return

'<h1>Test</h1>'

Definiranja putanje URL-a kroz app.route

dekorator:

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

Instanca aplikacije ima run metodu koja pokreće integrirani razvojni

web server unutar Flask-a:

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

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.

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

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

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

}

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

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.

Rješenje?

Aplication Factory

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

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

Aplication Factory

Ovo rješenje daje skripti vremena da namjesti

konfiguraciju.

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

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.

Kreiranje blueprinta(app/main/__init__.py)

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

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

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

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')# …

Pokretanje skripte(manage.py)

import osfrom app import create_app

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

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

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

Izgradnja replike virutalnog okružja

(venv) $ pip install -r requirements.txt

Kraj