In de vorige post Mod_wsgi in Apache hebben we de module in Apache 2.4 op Centos7 beschikbaar gemaakt. Het gebruik daarentegen is de volgende stap.
Laten we eerst beginnen met een simpele API in de default document root ‘/var/www/html/’ waar we een directory maken api_test
. Daarin maken we een virtuele omgeving via python3.8
en zetten wat structuur klaar:
mkdir /var/www/html/api_test mkdir /var/www/html/api_test/api cd /var/www/html/api_test python3.8 -m venv venv touch api.wsgi touch api/__init__.py
We activeren de virtual environment en zorgen dat pip geüpdatet is in deze ‘venv’ en installeren we de juiste package, namelijk Flask:
source venv/bin/activate python -m pip install --upgrade pip pip install flask
De uiteindelijke directory structuur en bestanden word dan:
api_test/ ├── api/ │ ├── __init__.py ├── venv/ └── api.wsgi
De API, voor nu een simpele JSON output van zichzelf en de Flask App zijn weggezet in het __init__.py
bestand. Dit is een redelijk plat geval:
from flask import request, jsonify, Flask import socket app = Flask(__name__) app.config['JSON_SORT_KEYS'] = False @app.route('/', defaults={'path': ''}) @app.route('/', methods=['GET']) def info(): return jsonify({ "name": "Test program", "version": "0.1a", "hostname": socket.gethostname(), "ip": request.remote_addr, }), 200
In het ‘wsgi’ bestand wat Apache gaat lezen instrueren we wat er gestart moet en een aantal path variabelen. De verwijzing naar de juiste package directory is vanwege de ‘virtual environment’. De andere is om de import van de API te laten werken. Uiteindelijk importeren wij dus uit de api
de app
als application
import sys sys.path.insert(0, '/var/www/html/api_test/venv/lib/python3.8/site-packages') sys.path.insert(1, '/var/www/html/api_test') from api import app as application
Binnen Apache, ‘virtual hosts’ of niet, kan je een aantal parameters opnemen die de mod_wsgi aansturen en het bovengenoemde bestand uitvoeren. Dit moet ingevoerd worden binnen de VirtualHost
tags of daar buiten:
WSGIDaemonProcess api user=apache group=apache threads=5 home=/var/www/html/api_test WSGIScriptAlias /api/v1 /var/www/html/api_test/api.wsgi <Directory /var/www/html/api_test> WSGIProcessGroup api <IfModule mod_authz_core.c> Require all granted </IfModule> </Directory>
Na het herstarten van de ‘httpd’ daemon zou de api beschikbaar moeten zijn. Laten we het testen van een externe server:
[bartjanh@godlyserver ~]$ curl https://www.pc-mania.nl/api/v1/ {"name":"Test program","version":"0.1a","hostname":"mightyserver.pc-mania.nl","ip":"2001:9a0:2005:85::24"}
De API werkt! Er is nog veel meer maar de minimale basis zoals het er staat, werkt zoals het hoort.