Did done
This commit is contained in:
commit
d32686b6d5
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
*.swp
|
||||||
|
venv/*
|
||||||
|
*.pyc
|
||||||
|
__pycache__/*
|
||||||
|
__pycache__
|
||||||
|
*.wpr
|
||||||
|
*.log
|
||||||
|
.idea/
|
72
app.py
Normal file
72
app.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
from flask import Flask, render_template, request, abort
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
from sqlalchemy import func
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('SQLALCHEMY_DATABASE_URI', "sqlite://")
|
||||||
|
db = SQLAlchemy(app)
|
||||||
|
KEY = os.environ['KEBAB_KEY']
|
||||||
|
|
||||||
|
|
||||||
|
class ResultRecord(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True, auto_increment=True)
|
||||||
|
score = db.Column(db.Integer, unique=False, nullable=False)
|
||||||
|
content = db.Column(db.Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Workers(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True, auto_increment=True)
|
||||||
|
ipaddr = db.Column(db.String, unique=True, nullable=False)
|
||||||
|
last_seen = db.Column(db.TIMESTAMP, nullable=False, server_default=func.now())
|
||||||
|
|
||||||
|
|
||||||
|
@app.before_first_request
|
||||||
|
def create_db():
|
||||||
|
db.create_all()
|
||||||
|
|
||||||
|
|
||||||
|
@app.route(f'/result/{KEY}', methods=['POST'])
|
||||||
|
def save_result():
|
||||||
|
result = request.get_json()
|
||||||
|
if not result:
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
if not isinstance(result, list):
|
||||||
|
abort(400)
|
||||||
|
|
||||||
|
rr = ResultRecord(content=json.dumps(result), score=len(result))
|
||||||
|
db.session.add(rr)
|
||||||
|
|
||||||
|
if request.headers.getlist("X-Forwarded-For"):
|
||||||
|
ip = request.headers.getlist("X-Forwarded-For")[0]
|
||||||
|
else:
|
||||||
|
ip = request.remote_addr
|
||||||
|
|
||||||
|
w = Workers.query.filter_by(ipaddr=ip).first()
|
||||||
|
if not w:
|
||||||
|
w = Workers(ipaddr=ip)
|
||||||
|
else:
|
||||||
|
w.last_seen = datetime.now()
|
||||||
|
|
||||||
|
db.session.add(w)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return "stored", 200
|
||||||
|
|
||||||
|
|
||||||
|
@app.route(f'/result/{KEY}', methods=['GET'])
|
||||||
|
def get_result():
|
||||||
|
best_result = ResultRecord.query.filter(ResultRecord.score == func.min(ResultRecord.score).select()).first_or_404()
|
||||||
|
res_count = ResultRecord.query.count()
|
||||||
|
workers = Workers.query.all()
|
||||||
|
|
||||||
|
best_result_content = json.loads(best_result.content)
|
||||||
|
|
||||||
|
return render_template('report.html', best_result=best_result_content, result_count=res_count, workers=workers)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
flask
|
||||||
|
sqlalchemy
|
||||||
|
flask-sqlalchemy
|
20
templates/report.html
Normal file
20
templates/report.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<h1>Current vertex count: {{ best_result|length }}</h1>
|
||||||
|
<h2>Total results submitted: {{ result_count }}</h2>
|
||||||
|
|
||||||
|
<h2>Current best solution</h2>
|
||||||
|
<pre>
|
||||||
|
{% for id in best_result %}
|
||||||
|
{{- id }}
|
||||||
|
{% endfor %}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>Workers:</h2>
|
||||||
|
<ul>
|
||||||
|
{% for worker in workers %}
|
||||||
|
<li>{{ worker.ipaddr }} - {{ worker.last_seen }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user