Slide 1

Slide 1 text

Christian Barra @christianbarra www.chrisbarra.me 1 Meetup Python Milan - 21/10/2014 Start with Flask

Slide 2

Slide 2 text

WHAT IS FLASK ? 2

Slide 3

Slide 3 text

• Flask is a “micro” framework • micro means that Flask keep the core simple but extensible • Flask won’t make many decisions for you, such as what database to use 3

Slide 4

Slide 4 text

BASICALLY. 4

Slide 5

Slide 5 text

• Werkzeug • Jinja2 • Others small things • No orm • No form • Only extensions 5

Slide 6

Slide 6 text

FLASK IS FUN. 6

Slide 7

Slide 7 text

7 from flask import Flask # Import Flask class app = Flask(__name__) # Create a new Flask instance @app.route(“/“) # Flask routing system def index(): # Your view return "Hello World” if __name__ == "__main__": app.run() # Run development server

Slide 8

Slide 8 text

8 $ pip install flask $ python hello.py * Running on http://localhost:5000/

Slide 9

Slide 9 text

RESPONSE OBJECT. 9

Slide 10

Slide 10 text

from flask import Flask, jsonify app = Flask(__name__) @app.route("/") def index(): msg = {"type": False, "code": "Something went wrong"} # Return a json object with 500 status code return jsonify(msg), 500 if __name__ == "__main__": app.run() 10

Slide 11

Slide 11 text

REQUEST OBJECT. 11

Slide 12

Slide 12 text

12 from flask import Flask, request app = Flask(__name__) @app.route("/", methods=[‘POST']) # You can specific methods for every view def index(): # create a dict with request data data = request.json user = request.json[‘user’] … … … return "I got your data !” if __name__ == "__main__": app.run()

Slide 13

Slide 13 text

METHOD VIEW. 13

Slide 14

Slide 14 text

14 from flask.views import MethodView class UserAPI(MethodView): def get(self): return "This is a GET request" def post(self): return "This is a POST request" def put(self): return "This is a PUT request" def delete(self): return "This is a DELETE request” app.add_url_rule('/', view_func=UserAPI.as_view('users'))

Slide 15

Slide 15 text

RETURN A TEMPLATE. 15

Slide 16

Slide 16 text

16 from flask import Flask, render_template app = Flask(__name__) @app.route("/") def index(): user = "Rag. Fantozzi" return render_template("index.html", user=user) if __name__ == "__main__": app.run()

Slide 17

Slide 17 text

BLUEPRINT. 17

Slide 18

Slide 18 text

18 from flask import Blueprint, render_template simple_page = Blueprint('simple_page', __name__, template_folder='templates') @simple_page.route('/') @simple_page.route('/') def show(page=None): if page is not None: return render_template('pages/%s.html' % page) else: return render_template('index.html')

Slide 19

Slide 19 text

19 from flask import Flask from yourapplication.simple_page import simple_page app = Flask(__name__) app.register_blueprint(simple_page) if __name__ == "__main__": app.run()

Slide 20

Slide 20 text

• Blueprint are not an applications • They are similar for some things • A blueprint is like a pluggable behavior for the main app 20

Slide 21

Slide 21 text

USEFUL DECORATORS. 21

Slide 22

Slide 22 text

• route: registers functions to handle routes • before_request: registers a function to run before request handlers • before_first_request: is similar, but only once at start • after_request: registers a function to run after request handlers run • teardown_request: registers a function to run after request handlers run, even if they throw an exception • errorhandler: defines a custom error handler 22

Slide 23

Slide 23 text

DJANGO VS FLASK. 23

Slide 24

Slide 24 text

WHAT I LIKE OF DJANGO. 24

Slide 25

Slide 25 text

• Full batteries (orm, form, session, user, ecc.) • Easy to add “app” • Great community • Stable • Popular 25

Slide 26

Slide 26 text

BUT. 26

Slide 27

Slide 27 text

• Sometimes it is much more than what you need • You need to follow Django pattern • Implement REST API is not so easy 27

Slide 28

Slide 28 text

WHAT I LIKE OF FLASK. 28

Slide 29

Slide 29 text

• Simple • Minimalist • Easy to learn and start • Well documented • Awesome as backend API 29

Slide 30

Slide 30 text

BUT. 30

Slide 31

Slide 31 text

• app = Flask(__name__) • context 31

Slide 32

Slide 32 text

APP = FLASK(__NAME_) 32

Slide 33

Slide 33 text

No magic, you need to share Flask instance between your files, but sometimes that can be a problem. 33

Slide 34

Slide 34 text

#views.py from flask import Flask from models import db app = Flask(__name__) #models.py from flask.ext.sqlalchemy import SQLAlchemy from views import app db = SQLAlchemy(app) 34

Slide 35

Slide 35 text

CIRCULAR IMPORT ! 35

Slide 36

Slide 36 text

#factory.py from flask.ext.sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(name): from flask import Flask app = Flask(name) db.init(app) return app #views.py from factory import create_app from models import db, OthersModels app = create_app(__name__) #models.py from factory import db 36

Slide 37

Slide 37 text

IT WORKS BUT NOT SO PYTHONIC (???) 37

Slide 38

Slide 38 text

CONTEXT 38

Slide 39

Slide 39 text

Often in your flask app you need to access the app context, as with app instance, sometimes that can be a problem. 39

Slide 40

Slide 40 text

#factory.py … … … def make_celery(package_name, app=None): from celery import Celery app = app or create_app(package_name) celery = Celery(package_name, broker=app.config['CELERY_BROKER_URL']) celery.conf.update(app.config) TaskBase = celery.Task class ContextTask(TaskBase): abstract = True def __call__(self, *args, **kwargs): with app.app_context(): return TaskBase.__call__(self, *args, **kwargs) celery.Task = ContextTask return celery 40

Slide 41

Slide 41 text

AGAIN IT WORKS BUT NOT SO PYTHONIC (???) 41

Slide 42

Slide 42 text

WE ARE NOT ALONE. 42

Slide 43

Slide 43 text

Tornado ? Falcon ? Wheezy Web ? Others ? 43

Slide 44

Slide 44 text

SOME RESOURCES. 44

Slide 45

Slide 45 text

Flask - http://flask.pocoo.org Flask list - http://librelist.com/browser/flask/ Miguel Grinberg - http://blog.miguelgrinberg.com/ Real Python - https://realpython.com/blog/ Google - http://goo.gl/Rps6vo 45

Slide 46

Slide 46 text

THIS IS THE END. 46

Slide 47

Slide 47 text

DID YOU LIKE THIS TALK ? 47

Slide 48

Slide 48 text

GREAT BECAUSE I’M LOOKING FOR A PART TIME JOB. 48

Slide 49

Slide 49 text

class part_time_job(): location = "Milan or remotely" current = "A wanna be data scientist" doing = ["Statistic at Bicocca", "read", "travel", "code"] knowledge = {} knowledge["Python"] = ["Django", "Flask", "Pandas", "…"] knowledge["JS"] = ["Nodejs", "AngularJS", “D3.js", "…"] knowledge["Database"] = ["PostgreSQL", "Redis", "…"] knowledge["Other"] = ["Machine learning", "much more !"] print("Do you want to hire me ?") print("My email {}@{}.com").format("barrachri", "gmail") 49

Slide 50

Slide 50 text

BRAINSTORMING & QUESTIONS TIME 50