build(server): modernize backend with python http.server and requirements
This commit is contained in:
parent
5ed9fdf2c1
commit
57c729f991
3 changed files with 117 additions and 10 deletions
|
|
@ -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
3
requirements.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
requests>=2.28.0
|
||||
beautifulsoup4>=4.11.0
|
||||
urllib3>=1.26.0
|
||||
84
server.py
Normal file
84
server.py
Normal 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()
|
||||
Reference in a new issue