SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Getting biggerwith 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 i
url 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 os
basedir = 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 Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.sqlalchemy import SQLAlchemy
from 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 Blueprint
main = 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_template
from . 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 os
from 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.1
Flask-Bootstrap==3.0.3.1
Flask-Migrate==1.1.0
Flask-Moment==0.2.0
Flask-SQLAlchemy==1.0
Izgradnja replike virutalnog okružja
(venv) $ pip install -r requirements.txt
Kraj

Weitere ähnliche Inhalte

Ähnlich wie Getting bigger with flask

Iir oracle baza podataka xe
Iir   oracle baza podataka xeIir   oracle baza podataka xe
Iir oracle baza podataka xe
aleksis2013
 
.Net framework
.Net framework.Net framework
.Net framework
krstic_nis
 
Front-end development iz ugla .NET programera
Front-end development iz ugla .NET programera�Front-end development iz ugla .NET programera�
Front-end development iz ugla .NET programera
Startit
 

Ähnlich wie Getting bigger with flask (20)

Migration to 9i
Migration to 9iMigration to 9i
Migration to 9i
 
Automatizacija u Front-end razvojnom procesu
Automatizacija u Front-end razvojnom procesuAutomatizacija u Front-end razvojnom procesu
Automatizacija u Front-end razvojnom procesu
 
Decouple Goals
Decouple GoalsDecouple Goals
Decouple Goals
 
Iir oracle baza podataka xe
Iir   oracle baza podataka xeIir   oracle baza podataka xe
Iir oracle baza podataka xe
 
SSO secure communication flow for web Oracle login
SSO secure communication flow for web Oracle loginSSO secure communication flow for web Oracle login
SSO secure communication flow for web Oracle login
 
Java
JavaJava
Java
 
Matlab web portal
Matlab web portalMatlab web portal
Matlab web portal
 
Java Script.ppt
Java Script.pptJava Script.ppt
Java Script.ppt
 
Sibin Grasić - Najčešće greške WP developera
Sibin Grasić - Najčešće greške WP developeraSibin Grasić - Najčešće greške WP developera
Sibin Grasić - Najčešće greške WP developera
 
Web logs: Collecting and analysing - Nikola Krgovic
Web logs: Collecting and analysing - Nikola KrgovicWeb logs: Collecting and analysing - Nikola Krgovic
Web logs: Collecting and analysing - Nikola Krgovic
 
Nikola Petrov-Bezbednost WordPress sajtova - Uvod u WordPress
 Nikola Petrov-Bezbednost WordPress sajtova - Uvod u WordPress Nikola Petrov-Bezbednost WordPress sajtova - Uvod u WordPress
Nikola Petrov-Bezbednost WordPress sajtova - Uvod u WordPress
 
Getting application production ready
Getting application production readyGetting application production ready
Getting application production ready
 
Firebase
FirebaseFirebase
Firebase
 
Sistemske operacije za stvaranje i unistenje procesa
Sistemske operacije za stvaranje i unistenje procesaSistemske operacije za stvaranje i unistenje procesa
Sistemske operacije za stvaranje i unistenje procesa
 
Ljubav Flexa I PHP-a
Ljubav Flexa I PHP-aLjubav Flexa I PHP-a
Ljubav Flexa I PHP-a
 
.Net framework
.Net framework.Net framework
.Net framework
 
2019 StartIT - Symfony i 12 factor arhitektura
2019 StartIT - Symfony i 12 factor arhitektura2019 StartIT - Symfony i 12 factor arhitektura
2019 StartIT - Symfony i 12 factor arhitektura
 
Front-end development iz ugla .NET programera
Front-end development iz ugla .NET programera�Front-end development iz ugla .NET programera�
Front-end development iz ugla .NET programera
 
Ajax -it_tehnologije
Ajax  -it_tehnologijeAjax  -it_tehnologije
Ajax -it_tehnologije
 
GitOps u teoriji Terraform praksi-Nebojša Ilić
GitOps u teoriji Terraform praksi-Nebojša IlićGitOps u teoriji Terraform praksi-Nebojša Ilić
GitOps u teoriji Terraform praksi-Nebojša Ilić
 

Getting bigger with flask