Slide 1

Slide 1 text

Flask Es muss ja nicht immer Django sein Ernesto Rico-Schmidt Grazer Linuxtage 2014 April 2014

Slide 2

Slide 2 text

Wie alles begann

Slide 3

Slide 3 text

Wie alles begann Aprilscherz 2010 http://denied.immersedcode.org/ Eine base-64 encodierte zip-Datei (Jinja2 und Werkzeug) Screencast: Blog in f¨ unf Minuten

Slide 4

Slide 4 text

Wie alles begann Aprilscherz 2010 http://denied.immersedcode.org/ Eine base-64 encodierte zip-Datei (Jinja2 und Werkzeug) Screencast: Blog in f¨ unf Minuten Marketing beats Quality – Armin Ronacher

Slide 5

Slide 5 text

Flask heute Armin Ronacher Python 2.6/2.7 und Python 3.3/3.4 http://flask.pocoo.org/ Version 0.10.1, 14. Juni 2013 2k Zeilen Code 4k Zeilen Tests ¨ uber 40 extensions 306 Seiten Dokumentation 2k Forks auf GitHub https://github.com/mitsuhiko/flask

Slide 6

Slide 6 text

Eine Flask-Applikation # hello.py from flask import Flask app = Flask(__name__) @app.route(’/’) def hello_world(): return ’Hello World!’ if __name__ == ’__main__’: app.run()

Slide 7

Slide 7 text

Routing @app.route(’/’) def index(): return ’Index Page’ @app.route(’/hello’) def hello(): return ’Hello World’

Slide 8

Slide 8 text

Routing Mit Variablen @app.route(’/user/’) def show_user_profile(username): return ’User %s’ % username @app.route(’/post/’) def show_post(post_id): return ’Post %d’ % post_id

Slide 9

Slide 9 text

HTTP Methoden from flask import request @app.route(’/login’, methods=[’GET’, ’POST’]) def login(): if request.method == ’POST’: do_the_login() else: show_the_login_form() ’GET’, ’HEAD’, ’POST’, ’PUT’, ’DELETE’ und ’OPTIONS’

Slide 10

Slide 10 text

Templates # hello.py from flask import Flask, render_template app = Flask(__name__) @app.route(’/hello/’) @app.route(’/hello/’) def hello(name=None): return render_template(’hello.html’, name=name) if __name__ == ’__main__’: app.run()

Slide 11

Slide 11 text

Templates Hello from Flask {% if name %}

Hello {{ name }}!

{% else %}

Hello World!

{% endif %}

Slide 12

Slide 12 text

Request-Objekt from flask import request @app.route(’/login’, methods=[’POST’, ’GET’]) def login(): error = None if request.method == ’POST’: if valid_login(request.form[’username’], request.form[’password’]): return log_the_user_in(request.form[’username’]) else: error = ’Invalid username/password’ return render_template(’login.html’, error=error)

Slide 13

Slide 13 text

Cookies # lesen from flask import request @app.route(’/’) def index(): username = request.cookies.get(’username’) # speichern from flask import make_response @app.route(’/’) def index(): response = make_response(render_template(...)) response.set_cookie(’username’, ’the username’) return response

Slide 14

Slide 14 text

Redirects und Fehler from flask import abort, redirect, url_for @app.route(’/’) def index(): return redirect(url_for(’login’)) @app.route(’/login’) def login(): abort(401) this_is_never_executed()

Slide 15

Slide 15 text

JSON # json.py from flask import json from datetime import datetime @app.route(’/_get_current_user’) def get_current_user(): return json.jsonify(username=g.user.username, email=g.user.email, id=g.user.id, now=datetime.now())

Slide 16

Slide 16 text

Extensions http://flask.pocoo.org/extensions/ Babel http://pypi.python.org/pypi/Flask-Babel Bcrypt http://pypi.python.org/pypi/Flask-Bcrypt CouchDB http://pypi.python.org/pypi/Flask-CouchDB Genshi http://pypi.python.org/pypi/Flask-Genshi Script http://pypi.python.org/pypi/Flask-Script SQLAlchemy http://pypi.python.org/pypi/Flask-SQLAlchemy WTF http://pypi.python.org/pypi/Flask-WTF

Slide 17

Slide 17 text

Weiterf¨ uhrende Links und B¨ ucher Armin Ronacher’s Thoughts and Writings: http://lucumr.pocoo.org/ HTTP Request & Response Service: http://httpbin.org/ Source: https://github.com/kennethreitz/httpbin Flask: http://flask.pocoo.org/ The Flask Mega-Tutorial: http://blog.miguelgrinberg.com/post/ the-flask-mega-tutorial-part-i-hello-world Flask Web Development Buch: http://flaskbook.com/