build(server): modernize backend with python http.server and requirements

This commit is contained in:
Tibo De Peuter 2026-08-18 18:21:46 +02:00
parent 5ed9fdf2c1
commit 57c729f991
3 changed files with 117 additions and 10 deletions

View file

@ -1,20 +1,40 @@
#!/usr/bin/env python3
"""
Dit script wordt gebruikt om de methodes in de scraper aan te roepen via JavaScript. Zo kan dit toch nog redelijk
onafhankelijk gebeuren en kan er gemakkelijker ge-debugged worden.
De bestandsextensie werd aangepast om te kunnen debuggen op zowel Windows als Linux.
Dit script wordt gebruikt om de methodes in de scraper aan te roepen via CLI of CGI.
De bestandsextensie werd behouden voor achterwaartse compatibiliteit.
"""
import cgi
import json
import sys
import os
from urllib.parse import parse_qs, unquote
sys.path.insert(0, os.path.dirname(__file__))
from scraper import run
parameters = cgi.FieldStorage()
data = json.loads(parameters.getvalue('data'))
antwoord = run(data['taal'], data['start'], data['einde'])
print("Content-Type: application/json")
print() # Lege lijn na headers
print(json.dumps(antwoord))
def get_input_data():
query_string = os.environ.get('QUERY_STRING', '')
if query_string:
params = parse_qs(query_string)
if 'data' in params:
return json.loads(unquote(params['data'][0]))
# Fallback to stdin or args
if len(sys.argv) > 1:
return json.loads(sys.argv[1])
return {'taal': 'en', 'start': 'Special:Random', 'einde': 'Philosophy'}
if __name__ == '__main__':
try:
data = get_input_data()
antwoord = run(data.get('taal', 'en'), data.get('start', 'Special:Random'), data.get('einde', 'Philosophy'))
except Exception as err:
antwoord = {'error': f"Fout bij verwerken: {str(err)}"}
print("Content-Type: application/json")
print() # Lege lijn na headers
print(json.dumps(antwoord))

3
requirements.txt Normal file
View file

@ -0,0 +1,3 @@
requests>=2.28.0
beautifulsoup4>=4.11.0
urllib3>=1.26.0

84
server.py Normal file
View file

@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""
Python standard library HTTP server replacing legacy CGI execution.
Serves static frontend files and provides JSON API endpoint for scraper paths.
"""
import http.server
import json
import os
import sys
from urllib.parse import parse_qs, urlparse, unquote
# Add cgi-bin directory to sys.path so scraper can be imported cleanly
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'cgi-bin'))
from scraper import run
class PhikipathiaHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
parsed_url = urlparse(self.path)
# Handle API endpoints: /cgi-bin/init.py or /api/find-path
if parsed_url.path in ['/cgi-bin/init.py', '/api/find-path']:
query_params = parse_qs(parsed_url.query)
taal = 'en'
start = 'Special:Random'
einde = 'Philosophy'
if 'data' in query_params:
try:
data_raw = unquote(query_params['data'][0])
data_json = json.loads(data_raw)
taal = data_json.get('taal', taal)
start = data_json.get('start', start)
einde = data_json.get('einde', einde)
except Exception as err:
self.send_json({'error': f"Fout bij verwerken van request parameters: {str(err)}"}, status=400)
return
else:
taal = query_params.get('taal', [taal])[0]
start = query_params.get('start', [start])[0]
einde = query_params.get('einde', [einde])[0]
try:
antwoord = run(taal, start, einde)
self.send_json(antwoord)
except Exception as e:
self.send_json({'error': f"Interne serverfout: {str(e)}"}, status=500)
return
# Default: serve static files (index.html, style.css, index.js, images)
super().do_GET()
def send_json(self, data, status=200):
body = json.dumps(data).encode('utf-8')
self.send_response(status)
self.send_header('Content-Type', 'application/json; charset=utf-8')
self.send_header('Content-Length', str(len(body)))
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('X-Content-Type-Options', 'nosniff')
self.send_header('X-Frame-Options', 'SAMEORIGIN')
self.end_headers()
self.wfile.write(body)
def log_message(self, format, *args):
# Clean logging format
sys.stderr.write(f"[{self.log_date_time_string()}] {format % args}\n")
def main():
port = int(os.environ.get('PORT', 8000))
server_address = ('', port)
httpd = http.server.HTTPServer(server_address, PhikipathiaHandler)
print(f"Phikipathia server active on http://localhost:{port}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServer shutting down.")
httpd.server_close()
if __name__ == '__main__':
main()