logotype

80 Ridge Street Media

Vi är experter på User Experience

Användaren i fokus. Effektivare appar. Bättre lönsamhet.

Foto från Revet, Jonstorp

Kom igång med Flask, ett mikroramverk skrivet i Python

Publicerad av   i Webbutveckling

Jag gillar dedikerade små ramverk som inte försöker göra allt och som kapar tiden för mig att få upp en webb. Jag gillar Flask väldigt mycket av just denna anledning. Flask är ett open source ramverk skrivet i Python av Armin Ronacher. Flask är ett så kallat micro-ramverk, det är litet tunt och löser inte alla problem halvbra utan fokuserar på att lösa ett fåtal problem väldigt bra. Version 0.9 av Flask släpptes precis i dagarna och du kan läsa om vilka features som finns i ramverket nu. Jag har lagt ut en liten flask-demo på Github så du enkelt kan komma igång med de saker som finns med i denna post.

Installation av Flask

För att köra Flask måste du ha Python 2.5 eller högre 2.x installation, det finns inget stöd för Python 3 än. Se till att du installerar rätt version av Python för ditt operativssystem. Exemplen nedan är för installation på Mac OS X dator. Det är väldigt enkelt att installera Flask, det enda du behöver är någon form av pakethanterare för Python installerad, pip eller easy_install, vi rekommenderar pip. Starta en terminal och skriv följande:

pip install Flask

Så bör det rassla till och Flask installeras på din maskin.

git clone git@github.com:hising/flask-demo.git && cd flask-demo
python app.py

Surfa sen till http://localhost:1337/

Om du öppnar upp app.py så ser du att vi lagt till lite extra lull-lull som att servern ska svara på alla IP-adresser som är bundna till maskinen på port 1337, debug=True är smidigt när du jobbar då filer laddas om när du ändrar dem, ska inte vara True i en live-miljö.

Routing i Flask

En av de absolut bästa sakerna med Flask är routingen. Routingen är hur du matchar url-mönster till funktionalitet. Den mest grundläggande routingen är denna:

@app.route("/")
def home():
    return render_template('home.html')

Det blir riktigt kraftfullt när vi tittar på routing med dynamiska variabler i url:erna som denna:

@app.route("/blog/<slug>")
def blog(slug):

Man kan även sätta typ, int, float eller path genom att specificera routen enligt “/path/<int:myint>”

Denna routing gör det enkelt att bygga överblickbar controller-kod för dina webbapplikationer och API:er.

I dina templates finns det en smutt helper som heter url_for som hjälper dig att skriva ut url:er för dina routes, den fungerar enligt följande:

<a href="{{ url_for('blog', slug='blogpost') }}">{{ url_for('blog', slug='blogpost') }}</a>

Formulärhantering i Flask

Flask har en enkel och ganska rakt-på hantering av formulär-data. Nedan ser du i exemplet att vår route funkar på GET och POST och på POST så tar vi emot de parametrar som användaren loggat in med.

from flask import Flask, render_template, jsonify, request
@app.route("/login", methods = ['GET', 'POST'])
def login():
  message = 'Hi, please login'
  if request.method == 'POST':
    message = 'Thanks for loggin in '
    username = request.form['username']
    password = request.form['password']
  return render_template('login.html', username = username, password = password, message = message)

Svara med JSON

I Flask är det väldigt enkelt att skicka JSON som response, vilket kan vara finemang om du ska bygga ett API, något som microramverk är ypperliga för att göra. Först behöver man importera in jsonify:

from flask import Flask, jsonify

Sen så är det bara att använda jsonify för att skapa ett response-objekt enligt nedan:

@app.route("/api/<method>")
def api(method):
    data = {
      'foo': 'bar',
      'method': method
    }
    response = jsonify(data)
    response.status_code = 200
    return response

Jinja-templates i Flask

Jinja är en kraftfull template-motor som kommer med Flask. Den har arv, automatisk escaping av HTML och är lätt att komma igång med. Det jag gillar mest är arven, vilket gör att du kan bygga en generell mall som du sedan väljer att antingen implementera eller utöka beroende på vad du har för behov. Det är enkelt att specificera defaultvärden för texter, scripts osv, det jag saknar är logiklösa templates som exempelvis Mustache så man enkelt kan använda samma mallar på klient som på serversidan. Templates ska ligga i en egen struktur direkt under app-rooten i /templates

Huvudmall (layout.html)

<!doctype html>
<html>
<head>
</head>
<body>
{% block body %}
Default text
{% endblock %}
</body>
</html>

Mallen som ärver:

{% extends "layout.html" %}
{% block body %}
Yihoo
{% endblock %}

Du ser fler exempel i min Flask Demo.

Statiska filer i Flask

Statiska filer i Flask distribueras med appen i en mapp som heter static direkt under app-rooten. När du går live bör du inte serva statiska filer från samma server som du servar appen. Läs gärna vår post om hur du sätter upp en snabb statisk server på nginx. Du kan, precis som för routes, använda template-metoden url_for för att skapa länkar till dina statiska filer

{{ url_for('static', filename='style.css') }}

På det sättet så kan du serva de statiska filerna från din app-server när du utvecklar lokalt och sen slå om konfigureringen när du kör live och få ut en url som pekar på din dedikerade statiska filserver.

Deploya en Flask applikation

Du kan ju köra den lokala servern när du utvecklar, men det fungerar inte när du ska släppa på användare, då vill du ha en server som är anpassad för flera samtidiga användare. Vi använder Gunicorn när vi deployar våra Python-appar. Den setupen vi har är att vi låter vår Python app lyssna på en port och så forwardar vi requests från nginx på port 80 till den python appen. Men det finns många olika sätt som du kan sätta upp din Flask-webb på när du går live, läs mer om olika Deployment-alternativ på Flasks hemsida.

Läs mer om Flask

Kategorier

Nyckelord

Kommentarer

Vill du lära dig mer om User Experience?

Anmäl dig till vår nyhetslista så får du tips direkt till din e-post.

Vill du lära dig mer om User Experience?

Anmäl dig till vår nyhetslista så får du tips direkt till din e-post.

Några av våra kunder


Senaste på bloggen

På vår blogg kan du läsa våra tankar kring User Experience.


80 Ridge Street Media AB

Bättre och mer effektiv webb och appar med fokus på User Experience, Product Management, SEO, Webbutveckling. Knivsta, Uppsala.

Åsgatan 80
74145 Knivsta, Uppsala
Telefon 0735-336699
E-post info@ridgestreet.se
Webb
Facebook ridgestreet
Twitter @80ridgestreet
Google Plus Google+