-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathapp.py
89 lines (70 loc) · 1.92 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from functools import wraps
from flask import (
Flask,
json,
redirect,
render_template,
request,
session,
url_for,
)
app = Flask(__name__)
app.secret_key = "secret"
messages = []
def send_message(message):
messages.append(message)
def login_required(func):
@wraps(func)
def inner(*args, **kwargs):
if "username" not in session:
return redirect(url_for("login"))
return func(*args, **kwargs)
return inner
@app.get("/")
@login_required
def index():
return render_template("index.html", username=session["username"])
@app.route("/login", methods=["GET", "POST"])
def login():
if "username" in session:
return redirect(url_for("index"))
if request.method == "POST":
username = request.form["username"]
session["username"] = username
send_message(
{
"username": username,
"message": f"{username} has joined.",
"type": "auth",
},
)
return redirect(url_for("index"))
return render_template("login.html")
@app.get("/logout")
def logout():
if "username" in session:
send_message(
{
"username": session["username"],
"message": f"{session['username']} has left.",
"type": "auth",
}
)
session.pop("username")
return redirect(url_for("index"))
@app.get("/events")
@login_required
def events():
def generate_response():
while True:
for message in messages:
yield f"data: {json.dumps(message)}\n\n"
messages.clear()
return app.response_class(generate_response(), mimetype="text/event-stream")
@app.post("/message")
@login_required
def message():
username = session["username"]
message = request.json["message"]
send_message({"username": username, "message": message})
return "OK"