Flask som CGI-skript
När man sätter en Flask-applikation i drift tillsammans med en webbserver finns det flera alternativ. Ett av de enklaste är att använda CGI för att köra din Flaskapplikation. För att köra Flask på studentservern behöver vi ett CGI-skript.
På studentservern kan du köra CGI-skript på detta sättet. Så här gör du för att koppla ett CGI-skript till din Flaskapplikation.
#En Flask-applikation
Du har en Flask-applikation som är sparad i app.py
. Den kan se ut så här, enklast möjliga inklusive två användbara felhanterare som gör felsökningen lättare.
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
Minimal Flask application, including useful error handlers.
"""
import traceback
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
""" Home route """
return("<h1>Hello World of Flask</h1><p>Rockn Roll...")
@app.errorhandler(404)
def page_not_found(e):
"""
Handler for page not found 404
"""
#pylint: disable=unused-argument
return "Flask 404 here, but not the page you requested."
@app.errorhandler(500)
def internal_server_error(e):
"""
Handler for internal server error 500
"""
#pylint: disable=unused-argument
return "<p>Flask 500<pre>" + traceback.format_exc()
if __name__ == "__main__":
app.run()
Du kan spara ovan kod i en fil app.py
och sedan köra den via python3 app.py
för att kontrollera att det fungerar.
Det är en bra sak att alltid testköra Flask-applikaitonen och app.py
för sig. Då kan man lösa eventuella felaktighetern innan man blandar in webbservern och CGI.
#Flask som CGI
Du kan nu lägga till en fil app.cgi
som via webbservern Apache kan köra din Flaskapplikation.
Skriptet app.cgi
kan se ut så här.
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# pylint: disable=import-outside-toplevel
"""
A CGI-script for python, including error handling.
"""
try:
from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)
except Exception as e:
import traceback
print("Content-Type: text/plain;charset=utf-8")
print("")
print(traceback.format_exc())
Skapa skriptet och lägg båda filerna i en katalog som är tillgänglig via en webbserver som har konfigurerat att CGI fungerar och Flask finns installerat.
Notera att app.cgi
behöver ha radslutstypen LF. Om filen har CRLF får man “Internal server error” på studentservern.
Öppna din webbläsare mot skriptet för att testa det, se till att lägga till en avslutande /
så länken avslutas med app.cgi/
, annars blir det 404.
Hela anropet är samlat under exceptionhantering för att visa tydliga felmeddelanden om något går snett. Om du kör detta i produktionsmiljö så vill du troligen inte vara så tydlig i att visa felmeddelanden.
#Testkör studentservern
Du kan testköra skripten lokalt i din egen webbserver och du kan lägga filerna i ditt kursrepo och göra dbwebb publish
för att publisera på studentservern och testköra där.
Får du problem på studentservern så kan du alltid logga in där och testköra python3 app.py
separat och python3 app.cgi
separat för att se eventuella felmeddelanden. Det kan hjälpa dig att felsöka och avgränsa var ett eventuellt fel ligger.
#Testkör och se källkod
Du kan testköra skriptet på följande platser. Glöm inte en avslutande /
.
Du kan se källkoden till exemplet i kursrepot för oopython.
#Lägg till CGI i Apache webbserver
Här är en kort-kort generell variant av hur du sätter upp CGI på din egna Apache webbserver. Detta behövs inte för att köra på studentservern.
Om du inte har konfigurerat din Apache webbserver för att köra CGI skript så är följande de steg som behövs utföras (på en Linux-maskin).
Lägg till så att modulen för CGI är aktiv.
sudo a2enmod cgi
Sedan behöver du aktivera CGI i din Apache konfigurationsfil, inom ett <directory>
direktiv.
Options +ExecCGI AddHandler cgi-script .cgi
Sedan kan du starta om Apache och testköra.
sudo service apache2 restart
#Avslutningsvis
I forumet finns ett par trådar som är relevanta att kika i, du hittar dem i Python FAQ under rubriken “Flask och CGI”.
#Revision history
- 2023-01-23: (D, aar) La till info rutan om LF radslut
- 2020-01-17: (C, aar) Lade till videos som visar hur vi använder det på studentserver och förklarar CGI.
- 2017-11-01: (B, mos) Lade till felhantering och indelat i stycken samt kort note om hur lägga till CGI i Apache.
- 2017-01-06: (A, mos) Första versionen.