Upload
josipkatalinic
View
232
Download
2
Tags:
Embed Size (px)
Citation preview
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