1
0
Fork 0
forked from anton/matekasse

tests versuch 2

This commit is contained in:
2000-Trek 2023-07-28 23:30:45 +02:00
parent fdf385fe06
commit c88f7df83a
2363 changed files with 408191 additions and 0 deletions

BIN
NFCreader.FCStd Normal file

Binary file not shown.

396
Website/__init__.py Normal file
View file

@ -0,0 +1,396 @@
from calendar import c
import queue, sqlite3, time, atexit, sys, uuid, json, urllib.parse, logging, datetime, os
from flask import Flask, render_template, request, make_response, session, url_for, g, Blueprint
from flask_socketio import SocketIO, join_room, leave_room
from flask_session import Session
from markupsafe import escape
from .db import get_db
#flask_config
DATABASE = 'Website/mate.db'
bp = Blueprint('auth', __name__, url_prefix='/auth')
def create_logs(app):
now = datetime.datetime.now().strftime('%d-%m-%Y-%H-%M-%S')
logging.basicConfig(filename=f"logs/matekasse-{now}.log",filemode='w', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ,encoding='utf-8', level=logging.INFO)
app.logger = logging.getLogger('db')
app.logger.info("Website is starting")
def create_app(test_config=None):
app = Flask(__name__)
key = str(uuid.uuid4().hex)
if test_config is None:
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = key
app.config['DATABASE'] = DATABASE
else:
app.config.from_mapping(test_config)
try:
os.makedirs(app.instance_path)
except OSError:
pass
with app.app_context():
create_logs(app)
Session(app)
socketio = SocketIO(app)
#@app.teardown_appcontext
#def close_connection(exception):
# db = getattr(g, '_database', None)
# if db is not None:
# db.close()
# app.logger.info("Website exited")
#var
status = True
users = queue.Queue()
finished = None
message = None
#website
@app.route('/favicon.ico')
def favicon():
return url_for('static', filename='Logo_CCC.svg.png')
@app.route('/socket.io.js')
def socketiojs():
return url_for('static', filename='socket.io.js')
@app.route("/")
def index():
return """
<a href="/list">user and tag list</a>
<p>The creator of this website accepts no liability for any linguistic or technical errors!</p>
<br style="line-height: 500%;"></br>
<a href="/documentation">Doumentation</a><script src="/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous">
</script>
<script type="text/javascript" charset="utf-8">
window.location="/list"
</script>
"""
@app.route("/list")
def list():
db = get_db()
c = db.cursor()
c.execute("SELECT * FROM users")
users = c.fetchall()
text = ""
for i in users:
text = text + f'<p><a href="list/user?id={i[0]}">{escape(i[1])}</a>: {i[2]} <form action="/change" method="get"><input name="id" type="hidden" value="{i[0]}"> Change balance: <input name="change"><input type="submit"></form></p> <br style="line-height: 50%;"></br>'
return '''<!DOCTYPE html>
<html lang="en">
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
socket.on("update", function(){
window.location="http://matekasse.server.c3h/list"
});
</script>
<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p>
<p>1 Credit = 1,50 Euro</p>
<form action="/list/user" method="get"> Search for User: <input name="user"><input type="submit"></form>
<form action="/adduser" method="get"><button type="submit">Add User</button></form>
<br></br>
''' + text + '<a href="/documentation">Doumentation</a></html>'
@app.route("/list/user", methods=['GET'])
def user_info():
db = get_db()
c = db.cursor()
id = request.args.get("id")
c.execute(f"SELECT * FROM users WHERE id=?", [id])
user_list = c.fetchall()
if user_list != []:
user = user_list[0]
c.execute(f"SELECT * FROM tags WHERE userid={user[0]}")
tags = c.fetchall()
text = ""
for tag in tags:
text = text + f"<p>{tag[0]}</p>"
return f"""<!DOCTYPE html>
<html lang="en">
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
""" + 'socket.on("update", function(){ window.location="http://matekasse.server.c3h/list/user?id=' + id + '"});' + f"""
</script>
<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p>
<p> {escape(user[1])} : {user[2]} <p>
<form action="/addtag" method="get"><input name="id" type="hidden" value="{user[0]}"><button type="submit">Add Tag</button></form>
<form action="/removetag" method="get"><input name="id" type="hidden" value="{user[0]}"><button type="submit">Remove Tag</button></form>
</p><form action="/change" method="get"><input name="id" type="hidden" value="{user[0]}"> Change balance: <input name="change"><input type="submit"></form>
</p>
<br></br>
<p>Tags:</p>
{text}
<br></br>
<form action="/removeuser/confirmation" method="get"><input name="id" type="hidden" value="{user[0]}"><button type="submit">Remove User</button></form>
</html>
"""
else:
return "Error: 043"
@app.route("/adduser")
def new_user():
return render_template("adduser.html")
@app.route("/removeuser/confirmation", methods=['GET'])
def confirm_remove_user():
user_id = request.args.get("id")
return f'<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p> <p>Do your realy want to <a href="/removeuser?id={user_id}">remove the user</a></p>'
@app.route("/removeuser", methods=['GET'])
def remove_user():
db = get_db()
c = db.cursor()
user_id = request.args.get("id")
c.execute(f"SELECT * FROM users WHERE id=?", [user_id])
users = c.fetchall()
if users != []:
user_name = users[0][1]
c.execute(f"DELETE FROM tags WHERE userid=?", [user_id])
app.logger.info(f"Deleted all tags from user ?", [user_id])
c.execute(f"DELETE FROM users WHERE id=?", [user_id])
app.logger.info(f"Deleted user ?", [user_id])
db.commit()
socketio.emit("update", "update")
return f'<p><p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p> <p>Deleted user {escape(user_name)}</p><a href="/list">return to the tags and user list</a></p>'
else:
return "Error: 043"
@app.route("/adduser/user", methods=['GET'])
def adduser():
db = get_db()
c = db.cursor()
username = request.args.get("username")
if username == None:
return "418"
c.execute("SELECT * FROM users WHERE username=?", [username])
if c.fetchall() == []:
c.execute("INSERT or IGNORE INTO users (username, balance) VALUES (?, 0)", [username])
db.commit()
socketio.emit("update", "update")
c.execute(f"SELECT * FROM users WHERE username=?", [username])
user = c.fetchone()
app.logger.info(f"Added user id: {user[0]} name: {user[2]}")
return """<html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
window.location="/list";
</script>
<p>tag was sucsesfully added</p>
</html>
"""
else:
return '<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p><p>Error: 757</p> '
@app.route("/change", methods=['GET'])
def change():
db = get_db()
c = db.cursor()
try:
user_id = request.args.get("id")
change = int(request.args.get("change"))
except:
return '<p>Error: 095</p><a href="/list">tags and user list</a>'
c.execute(f"SELECT * FROM users WHERE id=?", [user_id])
users = c.fetchall()
if users != []:
balance_old = users[0][2]
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user_id}")
db.commit()
c.execute(f"SELECT * FROM users WHERE id={user_id}")
user = c.fetchone()
app.logger.info(f"Changed the balance from user {user[0]} from {balance_old} to {user[2]}")
socketio.emit("update", "update")
return """<html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
window.location="/list";
</script>
</html>
"""
else:
return '<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p> <p>Error: 043</p>'
@app.route("/addtag", methods=['GET'])
def get_addtag_request():
global users
try:
user_id = int(request.args.get("id"))
except: #except im Normalen Code!
return "Error: 095"
session_id = uuid.uuid4()
session[id] = session_id
users.put([user_id, "add", session_id])
return render_template("addtag.html", user=user_id)
@socketio.on('addtag')
def request_addtag(data):
global finished
global message
join_room(session[id])
if len(users.queue) > 0:
user = users.queue[len(users.queue) - 1]
if user == [data["data"], "add", session[id]]:
socketio.emit("wait", "wait", to=session[id])
i = 0
while finished != [data["data"], "add", session[id]]:
time.sleep(1)
i += 1
if i > 20:
socketio.emit("error", "352", to=session[id])
notimportant = users.get()
break
else:
finished = None
socketio.emit("finished", f"{message}", to=session[id])
else:
socketio.emit("busy", "busy", to=session[id])
else:
socketio.emit("error", "418", to=session[id])
leave_room(session[id])
@app.route("/removetag", methods=['GET'])
def get_removetag_request():
global users
try:
user_id = int(request.args.get("id"))
except: #except im Normalen Code!
return "Wrong user id!"
session_id = uuid.uuid4()
session[id] = session_id
users.put([user_id, "remove", session_id])
return render_template("removetag.html", user=user_id)
@socketio.on('removetag')
def request_removetag(data):
global finished
global message
join_room(session[id])
if len(users.queue) > 0:
queue_item = users.queue[len(users.queue) - 1]
user = queue_item[0]
if queue_item == [data["data"], "remove", session[id]]:
socketio.emit("wait", "wait", to=session[id])
i = 0
while finished != [data["data"], "remove", session[id]]:
time.sleep(1)
i += 1
if i > 20:
socketio.emit("error", "352", to=session[id])
notimportant = users.get()
break
else:
finished = None
socketio.emit("finished", f"{message}", to=session[id])
else:
socketio.emit("busy", "busy", to=session[id])
else:
socketio.emit("error", "418", to=session[id])
leave_room(session[id])
#api
@app.route("/api/change", methods=['GET'])
def api_change():
db = get_db()
c = db.cursor()
userid = request.args.get("id")
c.execute("SELECT * FROM users WHERE id=?", [userid])
user_list = c.fetchall()
if user_list != []:
user = user_list[0]
try:
change = int(request.args.get("change"))
except:
change = -1
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
db.commit()
c.execute(f"SELECT * FROM users WHERE id = {userid}")
user_new = c.fetchone()
app.logger.info(f"Changed the balance from user {user[0]} from {user[2]} to {user_new[2]}")
socketio.emit("update", "update")
return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":user_new[2]}))
else:
return make_response(json.dumps({"mode":"error","error":"043"}))
@app.route("/api/tag_id", methods=['GET'])
def get_id():
global finished
global message
db = get_db()
c = db.cursor()
tag_id = request.args.get("id")
c.execute(f"SELECT * FROM tags WHERE tagid=?", [tag_id])
tag_list = c.fetchall()
if users.qsize() > 0:
queue_item = users.get()
user = queue_item[0]
state = queue_item[1]
c.execute(f"SELECT * FROM users WHERE id=?", [user])
username = c.fetchone()[1]
if state == "add":
c.execute(f"SELECT * FROM tags WHERE tagid={tag_id}")
if c.fetchall() != []:
message = "Error: 170"
finished = queue_item
return make_response(json.dumps({"mode":"error","error":"170"}))
else:
c.execute(f"INSERT OR IGNORE INTO tags (tagid, userid) VALUES ({tag_id}, ?)", [user])
message = f"Added {tag_id} to {username}"
app.logger.info(message)
finished = queue_item
db.commit()
return make_response(json.dumps({"mode":"message","username":"%s".format(username),"message":"A tag was added"}))
elif state == "remove":
c.execute(f"SELECT * FROM tags WHERE (tagid = {tag_id} AND userid = ?)", [user])
tags = c.fetchall()
if tags != []:
c.execute(f"DELETE FROM tags WHERE (tagid = {tag_id} AND userid = ?)", [user])
message = f"Removed {tag_id} from {username}"
app.logger.info(message)
finished = queue_item
db.commit()
return make_response(json.dumps({"mode":"message","username":"%s".format(username),"message":"A tag was removed"}))
else:
message = "054"
finished = queue_item
return make_response(json.dumps({"mode":"error","error":"054"}))
finished = queue_item
socketio.emit("update", "update")
return make_response(json.dumps({"mode":"error","error":"418"}))
elif tag_list != []:
tag = tag_list[0]
c.execute(f"SELECT * FROM users WHERE id={tag[1]}")
user_list = c.fetchall()
if user_list != []:
balance_old = user_list[0][2]
if users.qsize() == 0:
c.execute(f"UPDATE users SET balance = balance - 1 WHERE id={tag[1]}")
db.commit()
c.execute(f"SELECT * FROM users WHERE id={tag[1]}")
user = c.fetchone()
app.logger.info(f"Changed the balance from user {user[0]} from {balance_old} to {user[2]}")
socketio.emit("update", "update")
return make_response(json.dumps({"mode":"balance", "username":user[1], "balance":user[2]}))
else:
return make_response(json.dumps({"mode":"error", "error":"043"}))
socketio.emit("update", "update")
return make_response(json.dumps({"mode":"error","error":"054"}))
#Documentation
@app.route("/documentation")
def documentation():
return render_template("documentation.html")
return {"app":app,"socketio":socketio}

Binary file not shown.

Binary file not shown.

35
Website/db.py Normal file
View file

@ -0,0 +1,35 @@
import sqlite3
import click
from flask import current_app, g
def get_db():
if 'db' not in g:
g.db = sqlite3.connect(
current_app.config['DATABASE'],
detect_types=sqlite3.PARSE_DECLTYPES
)
g.db.row_factory = sqlite3.Row
return g.db
def close_db(e=None):
db = g.pop('db', None)
if db is not None:
db.close()
def init_db():
db = get_db()
with current_app.open_resource('schema.sql') as f:
db.executescript(f.read().decode('utf8'))
@click.command('init-db')
def init_db_command():
"""Clear the existing data and create new tables."""
init_db()
click.echo('Initialized the database.')

14
Website/mate.db.sql.txt Normal file
View file

@ -0,0 +1,14 @@
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "users" (
"id" INTEGER NOT NULL,
"username" TEXT NOT NULL,
"balance" INTEGER NOT NULL,
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "tags" (
"tagid" INEGER NOT NULL,
"userid" INTEGER,
FOREIGN KEY("userid") REFERENCES "users"("id"),
PRIMARY KEY("tagid")
);
COMMIT;

14
Website/schema.sql Normal file
View file

@ -0,0 +1,14 @@
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "users" (
"id" INTEGER NOT NULL,
"username" TEXT NOT NULL,
"balance" INTEGER NOT NULL,
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "tags" (
"tagid" INEGER NOT NULL,
"userid" INTEGER,
FOREIGN KEY("userid") REFERENCES "users"("id"),
PRIMARY KEY("tagid")
);
COMMIT;

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
var user = {{ user }}
socket.on('connect', function() {
socket.emit('addtag', {data: user});
});
socket.on("busy", function(){
document.write('<p>the nfc reader is busy at the moment. Pleas Wait ...</p>')
socket.emit('addtag', {data: user})
});
socket.on("wait", function(){
document.write('<p>Pleas hold your tag on to the nfc reader</p>')
});
socket.on("error", function(data) {
alert(data)
window.location="http://matekasse.server.c3h/"
});
socket.on("finished", function(data){
alert(data)
window.location="http://matekasse.server.c3h/"
});
</script>
</html>

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html lang="en">
<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p>
<p>
Username:
<form action="/adduser/user" method="get"><input name="username"><input type="submit"></form>
</p>
</html>

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>
{% block title %} {% endblock %} - FlaskApp
</title>
</head>
<body>
<nav>
<p><a href="/list">user and tag list</a> | <a href="/documentation">Documentation</a></p>
</nav>
<hr>
<div class="conntent">
{% block content %} {% endblock %}
</div>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
var change = {{change}}
socket.on('connect', function() {
socket.emit('addtag', {data: user});
});
socket.on("besetzt", function(){
document.write('<p>besetzt</p>')
socket.emit('addtag', {data: user})
});
socket.on("wait", function(){
document.write('<p>wait</p>')
});
socket.on("error", function(data) {
alert(data)
window.location="http://matekasse.server.c3h/"
});
socket.on("finished", function(data){
alert(data)
window.location="http://matekasse.server.c3h/"
});
</script>
</html>

View file

@ -0,0 +1,42 @@
body{
background-color: rgb(255, 255, 255);
font-size: 100%;
}
h1{
font-size: 10em;
color: rgb(0, 0, 0);
}
h2{
font-size: 5em;
color: rgb(0, 0, 0)
}
#Infos{
color: black;
box-shadow: 3px 3px gray ;
background-color: lightgreen;
border-style: solid;
border-radius: 40px;
padding: 5px;
border-width: 1px;
border-color:white;
margin-bottom: 50px;
}
#text_header{
color: black;
font-size: 40px;
}
#text{
text-align: center;
color: black;
background-color: gray;
border: 2px;
border-style: dashed;
border-color: white;
border-radius: 10px;
}

View file

@ -0,0 +1,46 @@
<html>
<head>
<title>Documentation</title>
<link rel="stylesheet" type="text/css" href="documentation.css">
<link rel="shortcut icon" type="Logo/png" href="ccc_logo.png"/>
</head>
<body>
<div id="Infos">
<p> <a href="/">index page</a> | <a href="/list">user and tag list</a></p>
</div>
<h1 class="header"> <u>Documentation</u> </h1>
<p>&nbsp;</p>
<div id="text">
<h2>API:</h2>
<p>http://matekasse.server.c3h/api/tag_id?={tag_id}</p>
<p>Response:
{"mode":"error" "error":"{error}"} or
{"mode":"message","username":"{username}","message":"{message}"} or
{"mode":"balance", "username":"{username}", "balance":"{balance}"}
</p>
<br></br>
<p>http://matekasse.server.c3h/api/change?id={user_id}&?change={change}</p>
<p>
If change = None or NaN the change will be -1
</p>
<p>
Response:
{"mode":"error" "error":"{error}"} or
{"mode":"balance", "username":"{username}", "balance":"{balance}"}
</p>
<br></br>
<h2>Error Codes:</h2>
<p>170: Tag already exists</p>
<p>054: Tag does not exists</p>
<p>757: Usere already exists</p>
<p>043: User does not exists</p>
<p>352: Timeout</p>
<p>095: Input is not a Number</p>
<P>418: I'm a teapot</P>
</div>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
var user = {{ user }}
socket.on('connect', function() {
socket.emit('removetag', {data: user});
});
socket.on("busy", function(){
document.write('<p>the nfc reader is busy at the moment. Pleas Wait ...</p>')
socket.emit('addtag', {data: user})
});
socket.on("wait", function(){
document.write('<p>Pleas hold your tag on to the nfc reader</p>')
});
socket.on("error", function(data) {
alert(data)
window.location="http://matekasse.server.c3h/"
});
socket.on("finished", function(data){
alert(data)
window.location="http://matekasse.server.c3h/"
});
</script>
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

View file

View file

View file

View file

@ -0,0 +1,30 @@
2023-07-22 20:10:18,663 - website - INFO - Website is starting
2023-07-22 20:10:18,673 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-22 20:10:18,677 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.6.223:5000
2023-07-22 20:10:18,677 - werkzeug - INFO - Press CTRL+C to quit
2023-07-22 20:10:24,790 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:10:24] "GET /adduser/user?username=testtesttest HTTP/1.1" 200 -
2023-07-22 20:10:24,880 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:10:24] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-22 20:10:28,076 - Website - ERROR - Exception on /adduser/user [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 176, in adduser
g.db_log.info(f"Added user id: {user[0]} name: {user[2]}")
^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/ctx.py", line 54, in __getattr__
raise AttributeError(name) from None
AttributeError: db_log
2023-07-22 20:10:28,080 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:10:28] "GET /adduser/user?username=testtesttesttest HTTP/1.1" 500 -

View file

@ -0,0 +1 @@
2023-07-22 20:13:36,788 - website - INFO - Website is starting

View file

@ -0,0 +1,7 @@
2023-07-22 20:14:17,705 - website - INFO - Website is starting
2023-07-22 20:14:17,901 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-22 20:14:17,925 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.6.223:5000
2023-07-22 20:14:17,925 - werkzeug - INFO - Press CTRL+C to quit

View file

@ -0,0 +1 @@
2023-07-22 20:14:58,598 - website - INFO - Website is starting

View file

@ -0,0 +1,31 @@
2023-07-22 20:17:47,405 - website - INFO - Website is starting
2023-07-22 20:17:47,414 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-22 20:17:47,418 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.6.223:5000
2023-07-22 20:17:47,418 - werkzeug - INFO - Press CTRL+C to quit
2023-07-22 20:17:51,168 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:17:51] "GET /adduser/user?username=testtesttesttest HTTP/1.1" 200 -
2023-07-22 20:17:51,258 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:17:51] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-22 20:17:54,567 - Website - ERROR - Exception on /adduser/user [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 176, in adduser
g.db_log.info(f"Added user id: {user[0]} name: {user[2]}")
^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/ctx.py", line 54, in __getattr__
raise AttributeError(name) from None
AttributeError: db_log
2023-07-22 20:17:54,572 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:17:54] "GET /adduser/user?username=testtesttesttesttest HTTP/1.1" 500 -
2023-07-22 20:17:54,672 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:17:54] "GET /favicon.ico HTTP/1.1" 200 -

View file

@ -0,0 +1 @@
2023-07-22 20:23:06,581 - website - INFO - Website is starting

View file

@ -0,0 +1 @@
2023-07-22 20:23:56,736 - website - INFO - Website is starting

View file

@ -0,0 +1,30 @@
2023-07-22 20:23:58,712 - website - INFO - Website is starting
2023-07-22 20:23:58,721 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-22 20:23:58,725 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.6.223:5000
2023-07-22 20:23:58,725 - werkzeug - INFO - Press CTRL+C to quit
2023-07-22 20:24:01,985 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:24:01] "GET /adduser/user?username=testtesttesttesttest HTTP/1.1" 200 -
2023-07-22 20:24:02,091 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:24:02] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-22 20:24:04,499 - Website - ERROR - Exception on /adduser/user [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 176, in adduser
g.db_log.info(f"Added user id: {user[0]} name: {user[2]}")
^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/ctx.py", line 54, in __getattr__
raise AttributeError(name) from None
AttributeError: db_log
2023-07-22 20:24:04,503 - werkzeug - INFO - 127.0.0.1 - - [22/Jul/2023 20:24:04] "GET /adduser/user?username=testtesttesttesttesttest HTTP/1.1" 500 -

View file

@ -0,0 +1,293 @@
2023-07-23 21:50:15,442 - db - INFO - Website is starting
2023-07-23 21:50:15,453 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-23 21:50:15,465 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.6.112:5000
2023-07-23 21:50:15,465 - werkzeug - INFO - Press CTRL+C to quit
2023-07-23 21:51:09,628 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:09] "GET / HTTP/1.1" 200 -
2023-07-23 21:51:09,775 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:09] "GET /socket.io.js HTTP/1.1" 200 -
2023-07-23 21:51:09,837 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:09] "GET /socket.io.js HTTP/1.1" 200 -
2023-07-23 21:51:09,909 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:09] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:10,046 - engineio.server - ERROR - The WebSocket transport is not available, you must install a WebSocket server that is compatible with your async mode to enable it. See the documentation for details. (further occurrences of this error will be logged with level INFO)
2023-07-23 21:51:10,047 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:10] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JaVN HTTP/1.1" 200 -
2023-07-23 21:51:10,103 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:10] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JaVn&sid=STMGADKhU-lxfSHaAAAA HTTP/1.1" 200 -
2023-07-23 21:51:10,104 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:10] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JaVo&sid=STMGADKhU-lxfSHaAAAA HTTP/1.1" 200 -
2023-07-23 21:51:10,121 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:10] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-23 21:51:15,943 - db - INFO - Changed the balance from user 1 from 0 to 1
2023-07-23 21:51:15,944 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:15] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JaWb&sid=STMGADKhU-lxfSHaAAAA HTTP/1.1" 200 -
2023-07-23 21:51:15,945 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:15] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:16,061 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:16] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:16,146 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:16] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jb-g HTTP/1.1" 200 -
2023-07-23 21:51:16,208 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:16] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Jb_5&sid=VvNShGGIGGaB1fVhAAAC HTTP/1.1" 200 -
2023-07-23 21:51:16,214 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:16] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jb_6&sid=VvNShGGIGGaB1fVhAAAC HTTP/1.1" 200 -
2023-07-23 21:51:18,951 - db - INFO - Changed the balance from user 1 from 1 to 2
2023-07-23 21:51:18,952 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:18] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jb_x&sid=VvNShGGIGGaB1fVhAAAC HTTP/1.1" 200 -
2023-07-23 21:51:18,954 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:18] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:19,048 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:19] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:19,142 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:19] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JcjP HTTP/1.1" 200 -
2023-07-23 21:51:19,175 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:19] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Jcjw&sid=Cwq7eaKYJhJVMfffAAAE HTTP/1.1" 200 -
2023-07-23 21:51:19,180 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:19] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jcjx&sid=Cwq7eaKYJhJVMfffAAAE HTTP/1.1" 200 -
2023-07-23 21:51:21,604 - db - INFO - Changed the balance from user 1 from 2 to 3
2023-07-23 21:51:21,605 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JckH&sid=Cwq7eaKYJhJVMfffAAAE HTTP/1.1" 200 -
2023-07-23 21:51:21,607 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:21,782 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:21,929 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JdOU HTTP/1.1" 200 -
2023-07-23 21:51:21,951 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JdPM&sid=XB6fDC6ALNlqSaZQAAAG HTTP/1.1" 200 -
2023-07-23 21:51:21,952 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:21] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JdPN&sid=XB6fDC6ALNlqSaZQAAAG HTTP/1.1" 200 -
2023-07-23 21:51:29,977 - db - INFO - Changed the balance from user 1 from 3 to 4
2023-07-23 21:51:29,978 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:29] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JdPj&sid=XB6fDC6ALNlqSaZQAAAG HTTP/1.1" 200 -
2023-07-23 21:51:29,979 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:29] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:30,089 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:30] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:30,195 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:30] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JfQ7 HTTP/1.1" 200 -
2023-07-23 21:51:30,229 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:30] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JfQa&sid=VdSZlj8pYkMrMnCkAAAI HTTP/1.1" 200 -
2023-07-23 21:51:30,231 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:30] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JfQb&sid=VdSZlj8pYkMrMnCkAAAI HTTP/1.1" 200 -
2023-07-23 21:51:32,282 - db - INFO - Changed the balance from user 1 from 4 to 5
2023-07-23 21:51:32,283 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JfQ-&sid=VdSZlj8pYkMrMnCkAAAI HTTP/1.1" 200 -
2023-07-23 21:51:32,285 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:32,367 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:32,468 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jfzi HTTP/1.1" 200 -
2023-07-23 21:51:32,529 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Jf-J&sid=bpuLnjkZWILAEC5CAAAK HTTP/1.1" 200 -
2023-07-23 21:51:32,530 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jf-L&sid=bpuLnjkZWILAEC5CAAAK HTTP/1.1" 200 -
2023-07-23 21:51:33,707 - db - INFO - Changed the balance from user 1 from 5 to 6
2023-07-23 21:51:33,708 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jf-v&sid=bpuLnjkZWILAEC5CAAAK HTTP/1.1" 200 -
2023-07-23 21:51:33,709 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:33,804 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:33,906 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JgK6 HTTP/1.1" 200 -
2023-07-23 21:51:33,946 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JgKT&sid=hu_fTOpsQxJg0XQEAAAM HTTP/1.1" 200 -
2023-07-23 21:51:33,948 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:33] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JgKV&sid=hu_fTOpsQxJg0XQEAAAM HTTP/1.1" 200 -
2023-07-23 21:51:35,330 - db - INFO - Changed the balance from user 1 from 6 to 7
2023-07-23 21:51:35,330 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JgL3&sid=hu_fTOpsQxJg0XQEAAAM HTTP/1.1" 200 -
2023-07-23 21:51:35,332 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:35,420 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:35,510 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JgjB HTTP/1.1" 200 -
2023-07-23 21:51:35,549 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Jgjj&sid=VA3MFFpHz5Kv3oCcAAAO HTTP/1.1" 200 -
2023-07-23 21:51:35,549 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:35] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jgjk&sid=VA3MFFpHz5Kv3oCcAAAO HTTP/1.1" 200 -
2023-07-23 21:51:36,885 - db - INFO - Changed the balance from user 1 from 7 to 8
2023-07-23 21:51:36,886 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:36] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jgk4&sid=VA3MFFpHz5Kv3oCcAAAO HTTP/1.1" 200 -
2023-07-23 21:51:36,888 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:36] "GET /change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 21:51:36,969 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:36] "GET /list HTTP/1.1" 200 -
2023-07-23 21:51:37,053 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:37] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jh5L HTTP/1.1" 200 -
2023-07-23 21:51:37,082 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:37] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Jh5f&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:51:37,083 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:51:37] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jh5g&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:02,053 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:02] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Jh64&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:02,066 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:02] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JnCA&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:27,066 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:27] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JnCB&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:27,078 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:27] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JtI-&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:52,078 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:52] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JtI_&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:52:52,090 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:52:52] "POST /socket.io/?EIO=4&transport=polling&t=Oc4JzPo&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:53:17,090 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:53:17] "GET /socket.io/?EIO=4&transport=polling&t=Oc4JzPo.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:53:17,102 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:53:17] "POST /socket.io/?EIO=4&transport=polling&t=Oc4K3Wc&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:53:42,102 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:53:42] "GET /socket.io/?EIO=4&transport=polling&t=Oc4K3We&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:53:42,113 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:53:42] "POST /socket.io/?EIO=4&transport=polling&t=Oc4K9dR&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:07,114 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:07] "GET /socket.io/?EIO=4&transport=polling&t=Oc4K9dR.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:07,124 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:07] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KFkE&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:32,124 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KFkF&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:32,134 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:32] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KLq_&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:57,134 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:57] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KLr1&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:54:57,145 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:54:57] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KRxn&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:55:22,145 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:55:22] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KRxo&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:55:22,155 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:55:22] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KY2b&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:55:47,155 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:55:47] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KY2b.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:55:47,167 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:55:47] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Ke9N&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:56:12,167 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:56:12] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Ke9O&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:56:12,176 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:56:12] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KkGA&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:56:37,176 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:56:37] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KkGB&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:56:37,187 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:56:37] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KqMy&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:02,187 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:02] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KqMy.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:02,202 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:02] "POST /socket.io/?EIO=4&transport=polling&t=Oc4KwTo&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:27,202 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:27] "GET /socket.io/?EIO=4&transport=polling&t=Oc4KwTp&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:27,214 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:27] "POST /socket.io/?EIO=4&transport=polling&t=Oc4L0ac&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:52,214 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:52] "GET /socket.io/?EIO=4&transport=polling&t=Oc4L0ae&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:57:52,233 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:57:52] "POST /socket.io/?EIO=4&transport=polling&t=Oc4L6hT&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:58:17,233 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:58:17] "GET /socket.io/?EIO=4&transport=polling&t=Oc4L6hU&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:58:17,245 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:58:17] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LCoL&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:58:42,245 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:58:42] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LCoL.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:58:42,268 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:58:42] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LIvE&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:07,268 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:07] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LIvF&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:07,280 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:07] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LP08&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:32,280 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LP09&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:32,290 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:32] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LV6y&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:57,290 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:57] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LV6y.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 21:59:57,301 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 21:59:57] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LbDk&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:00:22,301 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:00:22] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LbDk.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:00:22,313 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:00:22] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LhKX&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:00:47,313 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:00:47] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LhKX.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:00:47,324 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:00:47] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LnRL&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:01:12,324 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:01:12] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LnRM&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:01:12,335 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:01:12] "POST /socket.io/?EIO=4&transport=polling&t=Oc4LtY8&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:01:37,335 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:01:37] "GET /socket.io/?EIO=4&transport=polling&t=Oc4LtY8.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:01:37,347 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:01:37] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Lzex&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:02,347 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:02] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Lzey&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:02,359 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:02] "POST /socket.io/?EIO=4&transport=polling&t=Oc4M3ll&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:27,359 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:27] "GET /socket.io/?EIO=4&transport=polling&t=Oc4M3lm&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:27,369 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:27] "POST /socket.io/?EIO=4&transport=polling&t=Oc4M9sY&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:52,369 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:52] "GET /socket.io/?EIO=4&transport=polling&t=Oc4M9sZ&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:02:52,378 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:02:52] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MFzL&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:03:17,378 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:03:17] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MFzL.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:03:17,389 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:03:17] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MM45&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:03:42,389 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:03:42] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MM46&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:03:42,399 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:03:42] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MSAv&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:07,399 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:07] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MSAv.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:07,410 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:07] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MYHh&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:32,410 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MYHh.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:32,420 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:32] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MeOT&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:57,420 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:57] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MeOU&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:04:57,429 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:04:57] "POST /socket.io/?EIO=4&transport=polling&t=Oc4MkVF&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:05:22,429 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:05:22] "GET /socket.io/?EIO=4&transport=polling&t=Oc4MkVG&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:05:22,439 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:05:22] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Mqc1&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:05:47,439 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:05:47] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Mqc1.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:05:47,452 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:05:47] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Mwip&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:06:12,452 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:06:12] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Mwip.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:06:12,654 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:06:12] "POST /socket.io/?EIO=4&transport=polling&t=Oc4N0sb&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:06:37,654 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:06:37] "GET /socket.io/?EIO=4&transport=polling&t=Oc4N0sd&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:06:37,664 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:06:37] "POST /socket.io/?EIO=4&transport=polling&t=Oc4N6zQ&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:02,664 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:02] "GET /socket.io/?EIO=4&transport=polling&t=Oc4N6zR&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:02,676 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:02] "POST /socket.io/?EIO=4&transport=polling&t=Oc4ND4D&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:27,676 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:27] "GET /socket.io/?EIO=4&transport=polling&t=Oc4ND4E&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:27,687 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:27] "POST /socket.io/?EIO=4&transport=polling&t=Oc4NJA_&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:52,687 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:52] "GET /socket.io/?EIO=4&transport=polling&t=Oc4NJB0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:07:52,697 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:07:52] "POST /socket.io/?EIO=4&transport=polling&t=Oc4NPHo&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:08:17,698 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:08:17] "GET /socket.io/?EIO=4&transport=polling&t=Oc4NPHo.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:08:17,711 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:08:17] "POST /socket.io/?EIO=4&transport=polling&t=Oc4NVOb&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:08:42,711 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:08:42] "GET /socket.io/?EIO=4&transport=polling&t=Oc4NVOd&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:08:42,721 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:08:42] "POST /socket.io/?EIO=4&transport=polling&t=Oc4NbVQ&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:07,721 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:07] "GET /socket.io/?EIO=4&transport=polling&t=Oc4NbVQ.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:07,731 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:07] "POST /socket.io/?EIO=4&transport=polling&t=Oc4NhcC&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:32,731 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:32] "GET /socket.io/?EIO=4&transport=polling&t=Oc4NhcD&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:32,740 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:32] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Nni_&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:57,741 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:57] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Nni_.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:09:57,750 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:09:57] "POST /socket.io/?EIO=4&transport=polling&t=Oc4Ntpm&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:10:22,217 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:22] "GET /api/change?id=1 HTTP/1.1" 200 -
2023-07-23 22:10:22,750 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:22] "GET /socket.io/?EIO=4&transport=polling&t=Oc4Ntpm.0&sid=X0WNhKLoc6oIFtDHAAAQ HTTP/1.1" 200 -
2023-07-23 22:10:30,433 - db - INFO - Changed the balance from user 1 from 8 to 9
2023-07-23 22:10:30,434 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:30] "GET /api/change?id=1&change=1 HTTP/1.1" 200 -
2023-07-23 22:10:39,911 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:10:39,913 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:39] "GET /api/change?id=1&change=-1 HTTP/1.1" 500 -
2023-07-23 22:10:44,006 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:10:44,008 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:44] "GET /api/change?id=1&change=3 HTTP/1.1" 500 -
2023-07-23 22:10:45,551 - db - INFO - Changed the balance from user 1 from 8 to 5
2023-07-23 22:10:45,552 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:45] "GET /api/change?id=1&change=-3 HTTP/1.1" 200 -
2023-07-23 22:10:46,125 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:10:46,127 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:46] "GET /api/change?id=1&change=3 HTTP/1.1" 500 -
2023-07-23 22:10:48,942 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:10:48,944 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:10:48] "GET /api/change?id=1&change=-3 HTTP/1.1" 500 -
2023-07-23 22:11:19,316 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:11:19] "GET /api/change?id=1&change=test HTTP/1.1" 200 -
2023-07-23 22:11:27,259 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:11:27,261 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:11:27] "GET /api/change?id=1&change=1 HTTP/1.1" 500 -
2023-07-23 22:11:29,756 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:11:29,757 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:11:29] "GET /api/change?id=1&change=1 HTTP/1.1" 500 -
2023-07-23 22:11:31,289 - db - ERROR - Exception on /api/change [GET]
Traceback (most recent call last):
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/venv/lib/python3.11/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/anton/Documents/Projekte/Matekass_2.0/Website/__init__.py", line 315, in api_change
c.execute(f"UPDATE users SET balance = balance + {change} WHERE id={user[0]}")
sqlite3.OperationalError: database is locked
2023-07-23 22:11:31,291 - werkzeug - INFO - 127.0.0.1 - - [23/Jul/2023 22:11:31] "GET /api/change?id=1&change=1 HTTP/1.1" 500 -

View file

@ -0,0 +1,58 @@
2023-07-26 17:34:29,840 - db - INFO - Website is starting
2023-07-26 17:34:29,852 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-26 17:34:29,856 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.23.42.164:5000
2023-07-26 17:34:29,856 - werkzeug - INFO - Press CTRL+C to quit
2023-07-26 17:34:35,699 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:35] "GET / HTTP/1.1" 200 -
2023-07-26 17:34:35,803 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:35] "GET /socket.io.js HTTP/1.1" 200 -
2023-07-26 17:34:35,848 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:35] "GET /socket.io.js HTTP/1.1" 200 -
2023-07-26 17:34:35,886 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:35] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:35,953 - engineio.server - ERROR - The WebSocket transport is not available, you must install a WebSocket server that is compatible with your async mode to enable it. See the documentation for details. (further occurrences of this error will be logged with level INFO)
2023-07-26 17:34:35,954 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:35] "GET /socket.io/?EIO=4&transport=polling&t=OcIrdQh HTTP/1.1" 200 -
2023-07-26 17:34:36,003 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:36] "POST /socket.io/?EIO=4&transport=polling&t=OcIrdR7&sid=e7CLoFTsWnFpmDv1AAAA HTTP/1.1" 200 -
2023-07-26 17:34:36,003 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:36] "GET /socket.io/?EIO=4&transport=polling&t=OcIrdR8&sid=e7CLoFTsWnFpmDv1AAAA HTTP/1.1" 200 -
2023-07-26 17:34:36,013 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:36] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-26 17:34:39,662 - db - INFO - Changed the balance from user 1 from 8 to 0
2023-07-26 17:34:39,663 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "GET /socket.io/?EIO=4&transport=polling&t=OcIrdRg&sid=e7CLoFTsWnFpmDv1AAAA HTTP/1.1" 200 -
2023-07-26 17:34:39,665 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "GET /change?id=1&change=-8 HTTP/1.1" 200 -
2023-07-26 17:34:39,744 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:39,809 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "GET /socket.io/?EIO=4&transport=polling&t=OcIreMx HTTP/1.1" 200 -
2023-07-26 17:34:39,842 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "POST /socket.io/?EIO=4&transport=polling&t=OcIreN9&sid=__fMxTWuBFc62ubwAAAC HTTP/1.1" 200 -
2023-07-26 17:34:39,843 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:39] "GET /socket.io/?EIO=4&transport=polling&t=OcIreNA&sid=__fMxTWuBFc62ubwAAAC HTTP/1.1" 200 -
2023-07-26 17:34:42,661 - db - INFO - Changed the balance from user 1 from 0 to 8
2023-07-26 17:34:42,661 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "GET /socket.io/?EIO=4&transport=polling&t=OcIreNh&sid=__fMxTWuBFc62ubwAAAC HTTP/1.1" 200 -
2023-07-26 17:34:42,662 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "GET /change?id=1&change=8 HTTP/1.1" 200 -
2023-07-26 17:34:42,744 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:42,810 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "GET /socket.io/?EIO=4&transport=polling&t=OcIrf5q HTTP/1.1" 200 -
2023-07-26 17:34:42,833 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "POST /socket.io/?EIO=4&transport=polling&t=OcIrf5-&sid=3TXLHE6yOpHqWJ9tAAAE HTTP/1.1" 200 -
2023-07-26 17:34:42,834 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:42] "GET /socket.io/?EIO=4&transport=polling&t=OcIrf5_&sid=3TXLHE6yOpHqWJ9tAAAE HTTP/1.1" 200 -
2023-07-26 17:34:44,446 - db - INFO - Changed the balance from user 1 from 8 to 0
2023-07-26 17:34:44,447 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "GET /socket.io/?EIO=4&transport=polling&t=OcIrf6T&sid=3TXLHE6yOpHqWJ9tAAAE HTTP/1.1" 200 -
2023-07-26 17:34:44,449 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "GET /change?id=1&change=-8 HTTP/1.1" 200 -
2023-07-26 17:34:44,569 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:44,731 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "GET /socket.io/?EIO=4&transport=polling&t=OcIrfY- HTTP/1.1" 200 -
2023-07-26 17:34:44,785 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "POST /socket.io/?EIO=4&transport=polling&t=OcIrfZ_&sid=8wfAAZNHl1jXJHcAAAAG HTTP/1.1" 200 -
2023-07-26 17:34:44,798 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:44] "GET /socket.io/?EIO=4&transport=polling&t=OcIrfa0&sid=8wfAAZNHl1jXJHcAAAAG HTTP/1.1" 200 -
2023-07-26 17:34:45,792 - db - INFO - Changed the balance from user 1 from 0 to -8
2023-07-26 17:34:45,793 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "GET /socket.io/?EIO=4&transport=polling&t=OcIrfb2&sid=8wfAAZNHl1jXJHcAAAAG HTTP/1.1" 200 -
2023-07-26 17:34:45,794 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "GET /change?id=1&change=-8 HTTP/1.1" 200 -
2023-07-26 17:34:45,867 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:45,928 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "GET /socket.io/?EIO=4&transport=polling&t=OcIrfsY HTTP/1.1" 200 -
2023-07-26 17:34:45,952 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "POST /socket.io/?EIO=4&transport=polling&t=OcIrfsj&sid=DYSCqmzCeWFDM6dSAAAI HTTP/1.1" 200 -
2023-07-26 17:34:45,952 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:45] "GET /socket.io/?EIO=4&transport=polling&t=OcIrfsk&sid=DYSCqmzCeWFDM6dSAAAI HTTP/1.1" 200 -
2023-07-26 17:34:47,847 - db - INFO - Changed the balance from user 1 from -8 to 0
2023-07-26 17:34:47,847 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:47] "GET /socket.io/?EIO=4&transport=polling&t=OcIrft9&sid=DYSCqmzCeWFDM6dSAAAI HTTP/1.1" 200 -
2023-07-26 17:34:47,848 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:47] "GET /change?id=1&change=8 HTTP/1.1" 200 -
2023-07-26 17:34:47,924 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:47] "GET /list HTTP/1.1" 200 -
2023-07-26 17:34:48,002 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:48] "GET /socket.io/?EIO=4&transport=polling&t=OcIrgMs HTTP/1.1" 200 -
2023-07-26 17:34:48,024 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:48] "POST /socket.io/?EIO=4&transport=polling&t=OcIrgNH&sid=BybeEd6t_3bsEd4cAAAK HTTP/1.1" 200 -
2023-07-26 17:34:48,025 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:34:48] "GET /socket.io/?EIO=4&transport=polling&t=OcIrgNI&sid=BybeEd6t_3bsEd4cAAAK HTTP/1.1" 200 -
2023-07-26 17:35:01,307 - db - INFO - Changed the balance from user 1 from 0 to 1
2023-07-26 17:35:01,308 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:35:01] "GET /socket.io/?EIO=4&transport=polling&t=OcIrgNY&sid=BybeEd6t_3bsEd4cAAAK HTTP/1.1" 200 -
2023-07-26 17:35:01,309 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:35:01] "GET /api/change?id=1&change=1 HTTP/1.1" 200 -
2023-07-26 17:35:05,488 - db - INFO - Changed the balance from user 1 from 1 to 3
2023-07-26 17:35:05,490 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:35:05] "GET /api/change?id=1&change=2 HTTP/1.1" 200 -
2023-07-26 17:35:08,669 - db - INFO - Changed the balance from user 1 from 3 to 7
2023-07-26 17:35:08,670 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 17:35:08] "GET /api/change?id=1&change=4 HTTP/1.1" 200 -

View file

@ -0,0 +1,14 @@
2023-07-26 19:12:31,036 - db - INFO - Website is starting
2023-07-26 19:12:31,046 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-26 19:12:31,050 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.23.42.164:5000
2023-07-26 19:12:31,050 - werkzeug - INFO - Press CTRL+C to quit
2023-07-26 19:12:36,491 - db - INFO - Changed the balance from user 1 from 7 to 14
2023-07-26 19:12:36,492 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:12:36] "GET /api/change?id=1&change=7 HTTP/1.1" 200 -
2023-07-26 19:12:36,591 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:12:36] "GET /favicon.ico HTTP/1.1" 200 -
2023-07-26 19:12:38,162 - db - INFO - Changed the balance from user 1 from 14 to 21
2023-07-26 19:12:38,163 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:12:38] "GET /api/change?id=1&change=7 HTTP/1.1" 200 -
2023-07-26 19:12:38,900 - db - INFO - Changed the balance from user 1 from 21 to 28
2023-07-26 19:12:38,902 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:12:38] "GET /api/change?id=1&change=7 HTTP/1.1" 200 -

View file

@ -0,0 +1,21 @@
2023-07-26 19:59:28,371 - db - INFO - Website is starting
2023-07-26 19:59:28,383 - werkzeug - WARNING - WebSocket transport not available. Install simple-websocket for improved performance.
2023-07-26 19:59:28,388 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.23.42.164:5000
2023-07-26 19:59:28,388 - werkzeug - INFO - Press CTRL+C to quit
2023-07-26 19:59:32,464 - db - INFO - Changed the balance from user 1 from 28 to 35
2023-07-26 19:59:32,465 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:32] "GET /api/change?id=1&change=7 HTTP/1.1" 200 -
2023-07-26 19:59:36,173 - db - INFO - Changed the balance from user 1 from 35 to 28
2023-07-26 19:59:36,175 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:36] "GET /api/change?id=1&change=-7 HTTP/1.1" 200 -
2023-07-26 19:59:37,326 - db - INFO - Changed the balance from user 1 from 28 to 21
2023-07-26 19:59:37,328 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:37] "GET /api/change?id=1&change=-7 HTTP/1.1" 200 -
2023-07-26 19:59:37,953 - db - INFO - Changed the balance from user 1 from 21 to 14
2023-07-26 19:59:37,955 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:37] "GET /api/change?id=1&change=-7 HTTP/1.1" 200 -
2023-07-26 19:59:38,530 - db - INFO - Changed the balance from user 1 from 14 to 7
2023-07-26 19:59:38,532 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:38] "GET /api/change?id=1&change=-7 HTTP/1.1" 200 -
2023-07-26 19:59:51,956 - db - INFO - Changed the balance from user 1 from 7 to 2
2023-07-26 19:59:51,957 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:51] "GET /api/change?id=1&change=-5 HTTP/1.1" 200 -
2023-07-26 19:59:53,445 - db - INFO - Changed the balance from user 1 from 2 to -3
2023-07-26 19:59:53,447 - werkzeug - INFO - 127.0.0.1 - - [26/Jul/2023 19:59:53] "GET /api/change?id=1&change=-5 HTTP/1.1" 200 -

0
mocker.spy Normal file
View file

43
nfcreader.py Normal file
View file

@ -0,0 +1,43 @@
import nfc
import subprocess
import datetime
import requests
import sys
time_tag = {}
def get_reader():
devices = subprocess.check_output("lsusb")
for i in devices.split(b'\n'):
if str(i).__contains__("Advanced Card Systems, Ltd ACR122U"):
bus = str(i).split(":")[0].split(" Device ")[0].split("Bus ")[1]
device = str(i).split(":")[0].split("Device ")[1]
return("usb:{}:{}".format(bus, device))
sys.exit("\n\n Error: NFC reader konnte nicht erkannt werden! \n\n")
def onTagSense(tag):
id = int.from_bytes(tag.identifier, "big")
if id in time_tag and time_tag[id] > datetime.datetime.now().timestamp() - float(2):
return False
else:
time_tag[id] = datetime.datetime.now().timestamp()
print(id)
response = requests.get(f"http://localhost:5000/api/tag_id?id={id}")
print(response.text)
if response.text == "True":
return True
elif response.text == "False":
return False
else:
print("Error: falstsche Response erhalten")
return False
def main():
device = get_reader()
clf = nfc.ContactlessFrontend(device)
clf.open(device)
while True:
print("sensing")
clf.connect(rdwr={'on-connect': onTagSense, 'beep-on-connect': True})
main()

0
tests/__init__.py Normal file
View file

Binary file not shown.

Binary file not shown.

Binary file not shown.

14
tests/data.sql Normal file
View file

@ -0,0 +1,14 @@
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "users" (
"id" INTEGER NOT NULL,
"username" TEXT NOT NULL,
"balance" INTEGER NOT NULL,
PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "tags" (
"tagid" INEGER NOT NULL,
"userid" INTEGER,
FOREIGN KEY("userid") REFERENCES "users"("id"),
PRIMARY KEY("tagid")
);
COMMIT;

Binary file not shown.

38
tests/test_conf.py Normal file
View file

@ -0,0 +1,38 @@
import os
import tempfile
import pytest
from Website import create_app
from Website.db import get_db, init_db
with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
_data_sql = f.read().decode('utf8')
@pytest.fixture
def app():
db_fd, db_path = tempfile.mkstemp()
app = create_app({
'TESTING': True,
'DATABASE': "data.db",
})["app"]
with app.app_context():
init_db()
get_db().executescript(_data_sql)
yield app
os.close(db_fd)
os.unlink(db_path)
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def runner(app):
return app.test_cli_runner()

92
tests/test_website.py Normal file
View file

@ -0,0 +1,92 @@
from pydoc import cli
from urllib import response
from Website import create_app
import json
import pdb
from Website.db import get_db
from .test_conf import client, app
def test_config():
assert not create_app()["app"].testing
assert create_app({'TESTING': True})["app"].testing
#/adduser
def test_adduser(client):
response = client.get('/adduser/user')
assert "418" in response.data.decode('utf-8')
def test_adduser_new(app, client):
with app.app_context():
db = get_db()
assert db is get_db()
response = client.get('/adduser/user?username=test')
c = db.cursor()
c.execute("SELECT * FROM users WHERE username = ?", ["test"])
data = c.fetchone()
assert "tag was sucsesfully added" in response.data.decode('utf-8')
assert data[0] == 1
assert data[1] == "test"
assert data[2] == 0
def test_adduser_allreadyexists(client):
response = client.get('/adduser/user?username=test')
assert "Error: 757" in response.data.decode('utf-8')
#/addtag
def test_addtag(client):
response = client.get('/addtag')
assert response.data.decode('utf-8') == "Error: 095"
def test_addtag_userid_nan(client):
response = client.get('/addtag?id=test')
assert response.data.decode('utf-8') == "Error: 095"
def test_addtag(app, client):
response_addtag = client.get('/addtag?id=1')
with app.app_context():
None
response_tagid = client.get('/api/tag_id?id=12345678')
#/api
def test_api_change(client):
response = client.get('/api/change')
assert json.loads(response.data.decode('utf-8')) == {"mode":"error", "error":"043"}
def test_api_change_wrong_user(client):
response = client.get('/api/change?id=2')
assert json.loads(response.data.decode('utf-8')) == {"mode":"error", "error":"043"}
def test_api_change_nan(client):
response = client.get('/api/change?id=1&?change=test')
assert json.loads(response.data.decode('utf-8')) == {"mode":"balance", "username":"test", "balance":-1}
def test_api_change_none(client):
response = client.get('/api/change?id=1')
assert json.loads(response.data.decode('utf-8')) == {"mode":"balance", "username":"test", "balance":-2}
def test_api_change_right_positiv(app, client):
response = client.get('/api/change?id=1&change=7')
with app.app_context():
db = get_db()
assert db is get_db()
c = db.cursor()
c.execute("SELECT * FROM users WHERE username = ?", ["test"])
data = c.fetchone()
assert json.loads(response.data.decode('utf-8')) == {"mode":"balance", "username":"test", "balance":5}
assert data[0] == 1
assert data[1] == "test"
assert data[2] == 5
def test_api_change_right_negativ(app, client):
response = client.get('/api/change?id=1&change=-5')
with app.app_context():
db = get_db()
assert db is get_db()
c = db.cursor()
c.execute("SELECT * FROM users WHERE username = ?", ["test"])
data = c.fetchone()
assert json.loads(response.data.decode('utf-8')) == {"mode":"balance", "username":"test", "balance":0}
assert data[0] == 1
assert data[1] == "test"
assert data[2] == 0

247
venv/bin/Activate.ps1 Normal file
View file

@ -0,0 +1,247 @@
<#
.Synopsis
Activate a Python virtual environment for the current PowerShell session.
.Description
Pushes the python executable for a virtual environment to the front of the
$Env:PATH environment variable and sets the prompt to signify that you are
in a Python virtual environment. Makes use of the command line switches as
well as the `pyvenv.cfg` file values present in the virtual environment.
.Parameter VenvDir
Path to the directory that contains the virtual environment to activate. The
default value for this is the parent of the directory that the Activate.ps1
script is located within.
.Parameter Prompt
The prompt prefix to display when this virtual environment is activated. By
default, this prompt is the name of the virtual environment folder (VenvDir)
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
.Example
Activate.ps1
Activates the Python virtual environment that contains the Activate.ps1 script.
.Example
Activate.ps1 -Verbose
Activates the Python virtual environment that contains the Activate.ps1 script,
and shows extra information about the activation as it executes.
.Example
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
Activates the Python virtual environment located in the specified location.
.Example
Activate.ps1 -Prompt "MyPython"
Activates the Python virtual environment that contains the Activate.ps1 script,
and prefixes the current prompt with the specified string (surrounded in
parentheses) while the virtual environment is active.
.Notes
On Windows, it may be required to enable this Activate.ps1 script by setting the
execution policy for the user. You can do this by issuing the following PowerShell
command:
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
For more information on Execution Policies:
https://go.microsoft.com/fwlink/?LinkID=135170
#>
Param(
[Parameter(Mandatory = $false)]
[String]
$VenvDir,
[Parameter(Mandatory = $false)]
[String]
$Prompt
)
<# Function declarations --------------------------------------------------- #>
<#
.Synopsis
Remove all shell session elements added by the Activate script, including the
addition of the virtual environment's Python executable from the beginning of
the PATH variable.
.Parameter NonDestructive
If present, do not remove this function from the global namespace for the
session.
#>
function global:deactivate ([switch]$NonDestructive) {
# Revert to original values
# The prior prompt:
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
}
# The prior PYTHONHOME:
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
}
# The prior PATH:
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
}
# Just remove the VIRTUAL_ENV altogether:
if (Test-Path -Path Env:VIRTUAL_ENV) {
Remove-Item -Path env:VIRTUAL_ENV
}
# Just remove VIRTUAL_ENV_PROMPT altogether.
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
}
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
}
# Leave deactivate function in the global namespace if requested:
if (-not $NonDestructive) {
Remove-Item -Path function:deactivate
}
}
<#
.Description
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
given folder, and returns them in a map.
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
two strings separated by `=` (with any amount of whitespace surrounding the =)
then it is considered a `key = value` line. The left hand string is the key,
the right hand is the value.
If the value starts with a `'` or a `"` then the first and last character is
stripped from the value before being captured.
.Parameter ConfigDir
Path to the directory that contains the `pyvenv.cfg` file.
#>
function Get-PyVenvConfig(
[String]
$ConfigDir
) {
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
# An empty map will be returned if no config file is found.
$pyvenvConfig = @{ }
if ($pyvenvConfigPath) {
Write-Verbose "File exists, parse `key = value` lines"
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
$pyvenvConfigContent | ForEach-Object {
$keyval = $PSItem -split "\s*=\s*", 2
if ($keyval[0] -and $keyval[1]) {
$val = $keyval[1]
# Remove extraneous quotations around a string value.
if ("'""".Contains($val.Substring(0, 1))) {
$val = $val.Substring(1, $val.Length - 2)
}
$pyvenvConfig[$keyval[0]] = $val
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
}
}
}
return $pyvenvConfig
}
<# Begin Activate script --------------------------------------------------- #>
# Determine the containing directory of this script
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$VenvExecDir = Get-Item -Path $VenvExecPath
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
# Set values required in priority: CmdLine, ConfigFile, Default
# First, get the location of the virtual environment, it might not be
# VenvExecDir if specified on the command line.
if ($VenvDir) {
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
}
else {
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
Write-Verbose "VenvDir=$VenvDir"
}
# Next, read the `pyvenv.cfg` file to determine any required value such
# as `prompt`.
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
# Next, set the prompt from the command line, or the config file, or
# just use the name of the virtual environment folder.
if ($Prompt) {
Write-Verbose "Prompt specified as argument, using '$Prompt'"
}
else {
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
$Prompt = $pyvenvCfg['prompt'];
}
else {
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
$Prompt = Split-Path -Path $venvDir -Leaf
}
}
Write-Verbose "Prompt = '$Prompt'"
Write-Verbose "VenvDir='$VenvDir'"
# Deactivate any currently active virtual environment, but leave the
# deactivate function in place.
deactivate -nondestructive
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
# that there is an activated venv.
$env:VIRTUAL_ENV = $VenvDir
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
Write-Verbose "Setting prompt to '$Prompt'"
# Set the prompt to include the env name
# Make sure _OLD_VIRTUAL_PROMPT is global
function global:_OLD_VIRTUAL_PROMPT { "" }
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
function global:prompt {
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
_OLD_VIRTUAL_PROMPT
}
$env:VIRTUAL_ENV_PROMPT = $Prompt
}
# Clear PYTHONHOME
if (Test-Path -Path Env:PYTHONHOME) {
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
Remove-Item -Path Env:PYTHONHOME
}
# Add the venv to the PATH
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"

69
venv/bin/activate Normal file
View file

@ -0,0 +1,69 @@
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r 2> /dev/null
fi
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
unset VIRTUAL_ENV_PROMPT
if [ ! "${1:-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/home/anton/Documents/Projekte/Matekass_2.0/venv"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
PS1="(venv) ${PS1:-}"
export PS1
VIRTUAL_ENV_PROMPT="(venv) "
export VIRTUAL_ENV_PROMPT
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r 2> /dev/null
fi

26
venv/bin/activate.csh Normal file
View file

@ -0,0 +1,26 @@
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/home/anton/Documents/Projekte/Matekass_2.0/venv"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
set prompt = "(venv) $prompt"
setenv VIRTUAL_ENV_PROMPT "(venv) "
endif
alias pydoc python -m pydoc
rehash

69
venv/bin/activate.fish Normal file
View file

@ -0,0 +1,69 @@
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
# (https://fishshell.com/); you cannot run it directly.
function deactivate -d "Exit virtual environment and return to normal shell environment"
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
set -e _OLD_FISH_PROMPT_OVERRIDE
# prevents error when using nested fish instances (Issue #93858)
if functions -q _old_fish_prompt
functions -e fish_prompt
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
end
end
set -e VIRTUAL_ENV
set -e VIRTUAL_ENV_PROMPT
if test "$argv[1]" != "nondestructive"
# Self-destruct!
functions -e deactivate
end
end
# Unset irrelevant variables.
deactivate nondestructive
set -gx VIRTUAL_ENV "/home/anton/Documents/Projekte/Matekass_2.0/venv"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# Unset PYTHONHOME if set.
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# fish uses a function instead of an env var to generate the prompt.
# Save the current fish_prompt function as the function _old_fish_prompt.
functions -c fish_prompt _old_fish_prompt
# With the original prompt function renamed, we can override with our own.
function fish_prompt
# Save the return status of the last command.
set -l old_status $status
# Output the venv prompt; color taken from the blue of the Python logo.
printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal)
# Restore the return status of the previous command.
echo "exit $old_status" | .
# Output the original/"old" prompt.
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
set -gx VIRTUAL_ENV_PROMPT "(venv) "
end

8
venv/bin/coverage Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from coverage.cmdline import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/coverage-3.11 Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from coverage.cmdline import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/coverage3 Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from coverage.cmdline import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/flask Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from flask.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/pip Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/pip3 Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/pip3.11 Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

8
venv/bin/py.test Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pytest import console_main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(console_main())

8
venv/bin/pytest Executable file
View file

@ -0,0 +1,8 @@
#!/home/anton/Documents/Projekte/Matekass_2.0/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pytest import console_main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(console_main())

1
venv/bin/python Symbolic link
View file

@ -0,0 +1 @@
/usr/bin/python

1
venv/bin/python3 Symbolic link
View file

@ -0,0 +1 @@
python

1
venv/bin/python3.11 Symbolic link
View file

@ -0,0 +1 @@
python

View file

@ -0,0 +1 @@
pip

View file

@ -0,0 +1,28 @@
Copyright 2010 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,118 @@
Metadata-Version: 2.1
Name: Flask
Version: 2.3.2
Summary: A simple framework for building complex web applications.
Author-email: Armin Ronacher <armin.ronacher@active-4.com>
Maintainer-email: Pallets <contact@palletsprojects.com>
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://flask.palletsprojects.com/
Project-URL: Changes, https://flask.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/flask/
Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/
Project-URL: Chat, https://discord.gg/pallets
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Flask
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.8
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
Requires-Dist: Werkzeug (>=2.3.3)
Requires-Dist: Jinja2 (>=3.1.2)
Requires-Dist: itsdangerous (>=2.1.2)
Requires-Dist: click (>=8.1.3)
Requires-Dist: blinker (>=1.6.2)
Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10"
Provides-Extra: async
Requires-Dist: asgiref (>=3.2) ; extra == 'async'
Provides-Extra: dotenv
Requires-Dist: python-dotenv ; extra == 'dotenv'
Flask
=====
Flask is a lightweight `WSGI`_ web application framework. It is designed
to make getting started quick and easy, with the ability to scale up to
complex applications. It began as a simple wrapper around `Werkzeug`_
and `Jinja`_ and has become one of the most popular Python web
application frameworks.
Flask offers suggestions, but doesn't enforce any dependencies or
project layout. It is up to the developer to choose the tools and
libraries they want to use. There are many extensions provided by the
community that make adding new functionality easy.
.. _WSGI: https://wsgi.readthedocs.io/
.. _Werkzeug: https://werkzeug.palletsprojects.com/
.. _Jinja: https://jinja.palletsprojects.com/
Installing
----------
Install and update using `pip`_:
.. code-block:: text
$ pip install -U Flask
.. _pip: https://pip.pypa.io/en/stable/getting-started/
A Simple Example
----------------
.. code-block:: python
# save this as app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
.. code-block:: text
$ flask run
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Contributing
------------
For guidance on setting up a development environment and how to make a
contribution to Flask, see the `contributing guidelines`_.
.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst
Donate
------
The Pallets organization develops and supports Flask and the libraries
it uses. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.
.. _please donate today: https://palletsprojects.com/donate
Links
-----
- Documentation: https://flask.palletsprojects.com/
- Changes: https://flask.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Flask/
- Source Code: https://github.com/pallets/flask/
- Issue Tracker: https://github.com/pallets/flask/issues/
- Chat: https://discord.gg/pallets

View file

@ -0,0 +1,54 @@
../../../bin/flask,sha256=qZ2QIKvdFKG759PfwIunGTBu7m9UkMnEuF2VD06psG8,251
Flask-2.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask-2.3.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
Flask-2.3.2.dist-info/METADATA,sha256=o20FsyHfhQR8TMWB_QrtQN2PHyzacLRUAgol_quBBvA,3716
Flask-2.3.2.dist-info/RECORD,,
Flask-2.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask-2.3.2.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
Flask-2.3.2.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41
Flask-2.3.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6
flask/__init__.py,sha256=yeirfdSGPoM3Ylc9FWWJfy2gEQlHfiZCKrxBiPefACM,3731
flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30
flask/__pycache__/__init__.cpython-311.pyc,,
flask/__pycache__/__main__.cpython-311.pyc,,
flask/__pycache__/app.cpython-311.pyc,,
flask/__pycache__/blueprints.cpython-311.pyc,,
flask/__pycache__/cli.cpython-311.pyc,,
flask/__pycache__/config.cpython-311.pyc,,
flask/__pycache__/ctx.cpython-311.pyc,,
flask/__pycache__/debughelpers.cpython-311.pyc,,
flask/__pycache__/globals.cpython-311.pyc,,
flask/__pycache__/helpers.cpython-311.pyc,,
flask/__pycache__/logging.cpython-311.pyc,,
flask/__pycache__/scaffold.cpython-311.pyc,,
flask/__pycache__/sessions.cpython-311.pyc,,
flask/__pycache__/signals.cpython-311.pyc,,
flask/__pycache__/templating.cpython-311.pyc,,
flask/__pycache__/testing.cpython-311.pyc,,
flask/__pycache__/typing.cpython-311.pyc,,
flask/__pycache__/views.cpython-311.pyc,,
flask/__pycache__/wrappers.cpython-311.pyc,,
flask/app.py,sha256=ht3Qx9U9z0I1qUfLoS7bYhJcubdpk-i54eHq37LDlN8,87620
flask/blueprints.py,sha256=ZpVrwa8UY-YnVDsX_1K10XQjDwCUp7Qn2hmKln5icEQ,24332
flask/cli.py,sha256=wRxX61jRDKQM4iZsYaVwcgGbpN2_2DmntLMWjVeiAx4,33720
flask/config.py,sha256=yqdiN7TLOs2EChJ0uhTz3SICA3-QBG6l5wHTIUnANpc,12800
flask/ctx.py,sha256=x2kGzUXtPzVyi2YSKrU_PV1AvtxTmh2iRdriJRTSPGM,14841
flask/debughelpers.py,sha256=BR0xkd-sAyFuFW07D6NfrqNwSZxk1IrkG5n8zem-3sw,5547
flask/globals.py,sha256=KUzVvSPh8v28kUasVDi_aQKB9hI2jZSYQHqaDU2P414,2945
flask/helpers.py,sha256=QDxFmBW9GGXQDLuXrcxQRL0Ldo-_q11zEt3ZVgfINlI,24957
flask/json/__init__.py,sha256=pdtpoK2b0b1u7Sxbx3feM7VWhsI20l1yGAvbYWxaxvc,5572
flask/json/__pycache__/__init__.cpython-311.pyc,,
flask/json/__pycache__/provider.cpython-311.pyc,,
flask/json/__pycache__/tag.cpython-311.pyc,,
flask/json/provider.py,sha256=Os0frb8oGfyWKL-TDxb0Uy-MY6gDhPdJkRaUl5xAOXI,7637
flask/json/tag.py,sha256=ihb7QWrNEr0YC3KD4TolZbftgSPCuLk7FAvK49huYC0,8871
flask/logging.py,sha256=lArx2Bq9oTtUJ-DnZL9t88xU2zytzp4UWSM9Bd72NDQ,2327
flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
flask/scaffold.py,sha256=0tYQN98sC93YkIEw9g8BiIwceFZ27tNqBtBtFhFy5tY,35231
flask/sessions.py,sha256=rFH2QKXG24dEazkKGxAHqUpAUh_30hDHrddhVYgAcY0,14169
flask/signals.py,sha256=s1H4yKjf3c5dgVr41V6sJpE9dLJvmTJMYuK0rkqx3sw,1146
flask/templating.py,sha256=XdP2hMFnZ5FCZOG7HUaLjC2VC-b4uHSWlDjwv_1p3qc,7503
flask/testing.py,sha256=52-m5GecDcA-F2dFEYe8eDwApusxdg6S1suBaSC85N0,9768
flask/typing.py,sha256=4Lj-YTxUoYvPYofC9GKu-1o0Ht8lyjp9z3I336J13_o,3005
flask/views.py,sha256=V5hOGZLx0Bn99QGcM6mh5x_uM-MypVT0-RysEFU84jc,6789
flask/wrappers.py,sha256=PhMp3teK3SnEmIdog59cO_DHiZ9Btn0qI1EifrTdwP8,5709

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: true
Tag: py3-none-any

View file

@ -0,0 +1,2 @@
[console_scripts]
flask = flask.cli:main

View file

@ -0,0 +1 @@
flask

View file

@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2014 Miguel Grinberg
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -0,0 +1,75 @@
Metadata-Version: 2.1
Name: Flask-SocketIO
Version: 5.3.4
Summary: Socket.IO integration for Flask applications
Home-page: https://github.com/miguelgrinberg/flask-socketio
Author: Miguel Grinberg
Author-email: miguel.grinberg@gmail.com
Project-URL: Bug Tracker, https://github.com/miguelgrinberg/flask-socketio/issues
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: Flask (>=0.9)
Requires-Dist: python-socketio (>=5.0.2)
Flask-SocketIO
==============
[![Build status](https://github.com/miguelgrinberg/flask-socketio/workflows/build/badge.svg)](https://github.com/miguelgrinberg/Flask-SocketIO/actions) [![codecov](https://codecov.io/gh/miguelgrinberg/flask-socketio/branch/main/graph/badge.svg)](https://codecov.io/gh/miguelgrinberg/flask-socketio)
Socket.IO integration for Flask applications.
Sponsors
--------
The following organizations are funding this project:
![Socket.IO](https://images.opencollective.com/socketio/050e5eb/logo/64.png)<br>[Socket.IO](https://socket.io) | [Add your company here!](https://github.com/sponsors/miguelgrinberg)|
-|-
Many individual sponsors also support this project through small ongoing contributions. Why not [join them](https://github.com/sponsors/miguelgrinberg)?
Installation
------------
You can install this package as usual with pip:
pip install flask-socketio
Example
-------
```py
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.event
def my_event(message):
emit('my response', {'data': 'got it!'})
if __name__ == '__main__':
socketio.run(app)
```
Resources
---------
- [Tutorial](http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent)
- [Documentation](http://flask-socketio.readthedocs.io/en/latest/)
- [PyPI](https://pypi.python.org/pypi/Flask-SocketIO)
- [Change Log](https://github.com/miguelgrinberg/Flask-SocketIO/blob/main/CHANGES.md)
- Questions? See the [questions](https://stackoverflow.com/questions/tagged/flask-socketio) others have asked on Stack Overflow, or [ask](https://stackoverflow.com/questions/ask?tags=python+flask-socketio+python-socketio) your own question.

View file

@ -0,0 +1,13 @@
Flask_SocketIO-5.3.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Flask_SocketIO-5.3.4.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082
Flask_SocketIO-5.3.4.dist-info/METADATA,sha256=DAt6N9d2trl12V9EVnECC94FkHjl_4tZSlCe_nQf3WM,2574
Flask_SocketIO-5.3.4.dist-info/RECORD,,
Flask_SocketIO-5.3.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
Flask_SocketIO-5.3.4.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
Flask_SocketIO-5.3.4.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15
flask_socketio/__init__.py,sha256=RVXfUJi1MypU4Fq5MorzUquMMQUB_tYBgCrkOYfjMQ8,54782
flask_socketio/__pycache__/__init__.cpython-311.pyc,,
flask_socketio/__pycache__/namespace.cpython-311.pyc,,
flask_socketio/__pycache__/test_client.cpython-311.pyc,,
flask_socketio/namespace.py,sha256=b3oyXEemu2po-wpoy4ILTHQMVuVQqicogCDxfymfz_w,2020
flask_socketio/test_client.py,sha256=TZGQzhjQEnTN5JjK9a3-7DyA0o3Qgk8mkf5fOMOfFYA,10274

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: true
Tag: py3-none-any

View file

@ -0,0 +1 @@
flask_socketio

View file

@ -0,0 +1 @@
pip

View file

@ -0,0 +1,28 @@
Copyright 2007 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,113 @@
Metadata-Version: 2.1
Name: Jinja2
Version: 3.1.2
Summary: A very fast and expressive template engine.
Home-page: https://palletsprojects.com/p/jinja/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://jinja.palletsprojects.com/
Project-URL: Changes, https://jinja.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/jinja/
Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
Requires-Dist: MarkupSafe (>=2.0)
Provides-Extra: i18n
Requires-Dist: Babel (>=2.7) ; extra == 'i18n'
Jinja
=====
Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.
It includes:
- Template inheritance and inclusion.
- Define and import macros within templates.
- HTML templates can use autoescaping to prevent XSS from untrusted
user input.
- A sandboxed environment can safely render untrusted templates.
- AsyncIO support for generating templates and calling async
functions.
- I18N support with Babel.
- Templates are compiled to optimized Python code just-in-time and
cached, or can be compiled ahead-of-time.
- Exceptions point to the correct line in templates to make debugging
easier.
- Extensible filters, tests, functions, and even syntax.
Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
$ pip install -U Jinja2
.. _pip: https://pip.pypa.io/en/stable/getting-started/
In A Nutshell
-------------
.. code-block:: jinja
{% extends "base.html" %}
{% block title %}Members{% endblock %}
{% block content %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
Donate
------
The Pallets organization develops and supports Jinja and other popular
packages. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.
.. _please donate today: https://palletsprojects.com/donate
Links
-----
- Documentation: https://jinja.palletsprojects.com/
- Changes: https://jinja.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Jinja2/
- Source Code: https://github.com/pallets/jinja/
- Issue Tracker: https://github.com/pallets/jinja/issues/
- Website: https://palletsprojects.com/p/jinja/
- Twitter: https://twitter.com/PalletsTeam
- Chat: https://discord.gg/pallets

View file

@ -0,0 +1,58 @@
Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539
Jinja2-3.1.2.dist-info/RECORD,,
Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59
Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7
jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927
jinja2/__pycache__/__init__.cpython-311.pyc,,
jinja2/__pycache__/_identifier.cpython-311.pyc,,
jinja2/__pycache__/async_utils.cpython-311.pyc,,
jinja2/__pycache__/bccache.cpython-311.pyc,,
jinja2/__pycache__/compiler.cpython-311.pyc,,
jinja2/__pycache__/constants.cpython-311.pyc,,
jinja2/__pycache__/debug.cpython-311.pyc,,
jinja2/__pycache__/defaults.cpython-311.pyc,,
jinja2/__pycache__/environment.cpython-311.pyc,,
jinja2/__pycache__/exceptions.cpython-311.pyc,,
jinja2/__pycache__/ext.cpython-311.pyc,,
jinja2/__pycache__/filters.cpython-311.pyc,,
jinja2/__pycache__/idtracking.cpython-311.pyc,,
jinja2/__pycache__/lexer.cpython-311.pyc,,
jinja2/__pycache__/loaders.cpython-311.pyc,,
jinja2/__pycache__/meta.cpython-311.pyc,,
jinja2/__pycache__/nativetypes.cpython-311.pyc,,
jinja2/__pycache__/nodes.cpython-311.pyc,,
jinja2/__pycache__/optimizer.cpython-311.pyc,,
jinja2/__pycache__/parser.cpython-311.pyc,,
jinja2/__pycache__/runtime.cpython-311.pyc,,
jinja2/__pycache__/sandbox.cpython-311.pyc,,
jinja2/__pycache__/tests.cpython-311.pyc,,
jinja2/__pycache__/utils.cpython-311.pyc,,
jinja2/__pycache__/visitor.cpython-311.pyc,,
jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958
jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472
jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061
jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172
jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433
jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299
jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267
jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349
jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071
jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502
jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509
jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704
jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726
jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207
jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396
jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226
jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550
jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650
jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595
jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476
jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584
jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905
jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965
jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.37.1)
Root-Is-Purelib: true
Tag: py3-none-any

View file

@ -0,0 +1,2 @@
[babel.extractors]
jinja2 = jinja2.ext:babel_extract[i18n]

View file

@ -0,0 +1 @@
jinja2

View file

@ -0,0 +1,28 @@
Copyright 2010 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,93 @@
Metadata-Version: 2.1
Name: MarkupSafe
Version: 2.1.3
Summary: Safely add untrusted strings to HTML/XML markup.
Home-page: https://palletsprojects.com/p/markupsafe/
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/markupsafe/
Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
Project-URL: Chat, https://discord.gg/pallets
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
MarkupSafe
==========
MarkupSafe implements a text object that escapes characters so it is
safe to use in HTML and XML. Characters that have special meanings are
replaced so that they display as the actual characters. This mitigates
injection attacks, meaning untrusted user input can safely be displayed
on a page.
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U MarkupSafe
.. _pip: https://pip.pypa.io/en/stable/getting-started/
Examples
--------
.. code-block:: pycon
>>> from markupsafe import Markup, escape
>>> # escape replaces special characters and wraps in Markup
>>> escape("<script>alert(document.cookie);</script>")
Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
>>> # wrap in Markup to mark text "safe" and prevent escaping
>>> Markup("<strong>Hello</strong>")
Markup('<strong>hello</strong>')
>>> escape(Markup("<strong>Hello</strong>"))
Markup('<strong>hello</strong>')
>>> # Markup is a str subclass
>>> # methods and operators escape their arguments
>>> template = Markup("Hello <em>{name}</em>")
>>> template.format(name='"World"')
Markup('Hello <em>&#34;World&#34;</em>')
Donate
------
The Pallets organization develops and supports MarkupSafe and other
popular packages. In order to grow the community of contributors and
users, and allow the maintainers to devote more time to the projects,
`please donate today`_.
.. _please donate today: https://palletsprojects.com/donate
Links
-----
- Documentation: https://markupsafe.palletsprojects.com/
- Changes: https://markupsafe.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/MarkupSafe/
- Source Code: https://github.com/pallets/markupsafe/
- Issue Tracker: https://github.com/pallets/markupsafe/issues/
- Chat: https://discord.gg/pallets

View file

@ -0,0 +1,14 @@
MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
MarkupSafe-2.1.3.dist-info/METADATA,sha256=Wvvh4Tz-YtW24YagYdqrrrBdm9m-DjTdqJWhxlbU6-0,3003
MarkupSafe-2.1.3.dist-info/RECORD,,
MarkupSafe-2.1.3.dist-info/WHEEL,sha256=8KU227XctfdX2qUwyjQUO-ciQuZtmyPUCKmeGV6Byto,152
MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
markupsafe/__init__.py,sha256=xIItqrn1Bwi7FxPJO9rCVQBG0Evewue1Tl4BV0l9xEs,10338
markupsafe/__pycache__/__init__.cpython-311.pyc,,
markupsafe/__pycache__/_native.cpython-311.pyc,,
markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713
markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083
markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so,sha256=7e82QrIqSWEZfAkAJBQHPuVy7ci8nD07GQHDlGXn1hU,53656
markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229
markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0

View file

@ -0,0 +1,6 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: false
Tag: cp311-cp311-manylinux_2_17_x86_64
Tag: cp311-cp311-manylinux2014_x86_64

View file

@ -0,0 +1 @@
markupsafe

View file

@ -0,0 +1,28 @@
Copyright 2007 Pallets
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,119 @@
Metadata-Version: 2.1
Name: Werkzeug
Version: 2.3.6
Summary: The comprehensive WSGI web application library.
Maintainer-email: Pallets <contact@palletsprojects.com>
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://werkzeug.palletsprojects.com/
Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/werkzeug/
Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/
Project-URL: Chat, https://discord.gg/pallets
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.8
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
Requires-Dist: MarkupSafe (>=2.1.1)
Provides-Extra: watchdog
Requires-Dist: watchdog (>=2.3) ; extra == 'watchdog'
Werkzeug
========
*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff")
Werkzeug is a comprehensive `WSGI`_ web application library. It began as
a simple collection of various utilities for WSGI applications and has
become one of the most advanced WSGI utility libraries.
It includes:
- An interactive debugger that allows inspecting stack traces and
source code in the browser with an interactive interpreter for any
frame in the stack.
- A full-featured request object with objects to interact with
headers, query args, form data, files, and cookies.
- A response object that can wrap other WSGI applications and handle
streaming data.
- A routing system for matching URLs to endpoints and generating URLs
for endpoints, with an extensible system for capturing variables
from URLs.
- HTTP utilities to handle entity tags, cache control, dates, user
agents, cookies, files, and more.
- A threaded WSGI server for use while developing applications
locally.
- A test client for simulating HTTP requests during testing without
requiring running a server.
Werkzeug doesn't enforce any dependencies. It is up to the developer to
choose a template engine, database adapter, and even how to handle
requests. It can be used to build all sorts of end user applications
such as blogs, wikis, or bulletin boards.
`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while
providing more structure and patterns for defining powerful
applications.
.. _WSGI: https://wsgi.readthedocs.io/en/latest/
.. _Flask: https://www.palletsprojects.com/p/flask/
Installing
----------
Install and update using `pip`_:
.. code-block:: text
pip install -U Werkzeug
.. _pip: https://pip.pypa.io/en/stable/getting-started/
A Simple Example
----------------
.. code-block:: python
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response('Hello, World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
Donate
------
The Pallets organization develops and supports Werkzeug and other
popular packages. In order to grow the community of contributors and
users, and allow the maintainers to devote more time to the projects,
`please donate today`_.
.. _please donate today: https://palletsprojects.com/donate
Links
-----
- Documentation: https://werkzeug.palletsprojects.com/
- Changes: https://werkzeug.palletsprojects.com/changes/
- PyPI Releases: https://pypi.org/project/Werkzeug/
- Source Code: https://github.com/pallets/werkzeug/
- Issue Tracker: https://github.com/pallets/werkzeug/issues/
- Chat: https://discord.gg/pallets

View file

@ -0,0 +1,126 @@
Werkzeug-2.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Werkzeug-2.3.6.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475
Werkzeug-2.3.6.dist-info/METADATA,sha256=BdsAbo_jtuo9bG0Tx6vBULMr7VPCHnHGo_Rvza8KSFc,4146
Werkzeug-2.3.6.dist-info/RECORD,,
Werkzeug-2.3.6.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
Werkzeug-2.3.6.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9
werkzeug/__init__.py,sha256=GE-glr5Ri57UhBnkXrFicJrcM3JMATvBS3SEdi3rR6Q,188
werkzeug/__pycache__/__init__.cpython-311.pyc,,
werkzeug/__pycache__/_internal.cpython-311.pyc,,
werkzeug/__pycache__/_reloader.cpython-311.pyc,,
werkzeug/__pycache__/exceptions.cpython-311.pyc,,
werkzeug/__pycache__/formparser.cpython-311.pyc,,
werkzeug/__pycache__/http.cpython-311.pyc,,
werkzeug/__pycache__/local.cpython-311.pyc,,
werkzeug/__pycache__/security.cpython-311.pyc,,
werkzeug/__pycache__/serving.cpython-311.pyc,,
werkzeug/__pycache__/test.cpython-311.pyc,,
werkzeug/__pycache__/testapp.cpython-311.pyc,,
werkzeug/__pycache__/urls.cpython-311.pyc,,
werkzeug/__pycache__/user_agent.cpython-311.pyc,,
werkzeug/__pycache__/utils.cpython-311.pyc,,
werkzeug/__pycache__/wsgi.cpython-311.pyc,,
werkzeug/_internal.py,sha256=tbijqLWDIRP_AaPSBswRI5KuzDB3Dy5M6rRGFlCAqt4,8688
werkzeug/_reloader.py,sha256=1O1DDWlqVwYIX8kgJwH5B4a_Uh6acQnw3sQf01JpXtM,14745
werkzeug/datastructures/__init__.py,sha256=yzBdOT9DdK3nraNG49pA3bVsvtPPLx2-t2N8ZmuAd9w,1900
werkzeug/datastructures/__pycache__/__init__.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/accept.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/auth.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/cache_control.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/csp.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/etag.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/file_storage.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/headers.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/mixins.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/range.cpython-311.pyc,,
werkzeug/datastructures/__pycache__/structures.cpython-311.pyc,,
werkzeug/datastructures/accept.py,sha256=CuCvBAxNzbt4QUb17rH986vvOVGURFUjo0DX2PQy_yI,10670
werkzeug/datastructures/accept.pyi,sha256=6P114gncjZoy-i_n_3OQy2nJVwjEAIe7PcBxKYqCEfc,1917
werkzeug/datastructures/auth.py,sha256=Mm92MLyv_M9Cgto8oNz65l_dZZ8sAibyY6NuKDW3pcs,16040
werkzeug/datastructures/cache_control.py,sha256=RTUipZev50s-1TAn2rYGZrytm_6IOIxQd67fkR5bNF0,6043
werkzeug/datastructures/cache_control.pyi,sha256=6Q93jRysAKMPWRA72OMksyn7d3ZysuxwGlHp_iwF9pA,3756
werkzeug/datastructures/csp.py,sha256=DAOAO266LK0JKbvlG80bbkAgfrNsnU9HBoz-FdIYNdo,3244
werkzeug/datastructures/csp.pyi,sha256=AmDWiZU4rrJA4SZmyMNI1L5PLdIfJsI5Li9r5lE1q6M,5765
werkzeug/datastructures/etag.py,sha256=JsyI-yXayF-hQu26MyFzbHFIZsaQ6odj3RZO_jF-_cc,2913
werkzeug/datastructures/etag.pyi,sha256=N9cuUBrZnxHmsbW0BBmjKW-djNY7WKbI6t_WopB8Zo0,1047
werkzeug/datastructures/file_storage.py,sha256=ePeMtr65s_1_sunXMv_SBOiFof5CX5BepYv5_W16fZk,6184
werkzeug/datastructures/file_storage.pyi,sha256=2sdbKHhvbQF5FjrJuO6l_m1yZvZ4oPCUTspmdmjQlSU,1433
werkzeug/datastructures/headers.py,sha256=V08N4VTcaA11fRq1WK5v28QomGd-A1S9CmiwugixhWo,18882
werkzeug/datastructures/headers.pyi,sha256=66Gh9DbD8QNpLRBOuer4DMCj12csddHrcgxiJPLE5n8,4237
werkzeug/datastructures/mixins.py,sha256=-IQSQ70UOMQlqtJEIyyhplOd4obaTOfzGvka-cunCtM,5337
werkzeug/datastructures/mixins.pyi,sha256=y92tClxVslJBEGgAwDRsQLExfin2p0x7NfnP_b8w6xc,4191
werkzeug/datastructures/range.py,sha256=JXSDPseG7iH5giJp3R1SnQC_SqQp634M8Iv6QTsbTxM,5669
werkzeug/datastructures/range.pyi,sha256=bsM61iNp86gT2lyN0F_Dqg8xsnfPerdmElipuHppiJQ,1792
werkzeug/datastructures/structures.py,sha256=_bhAf0adEk6WU2uy8jdmuxFMTFcuClY1p7jQ-3wYXj4,31761
werkzeug/datastructures/structures.pyi,sha256=MRg-RubT3UPjh62i9-7Xht8DVL0zTApRzjs52Hfz_j4,8148
werkzeug/debug/__init__.py,sha256=WRTLJSvnuK6jlBuQLllTnN57th0HKPjxbS7-d8QJZIc,18760
werkzeug/debug/__pycache__/__init__.cpython-311.pyc,,
werkzeug/debug/__pycache__/console.cpython-311.pyc,,
werkzeug/debug/__pycache__/repr.cpython-311.pyc,,
werkzeug/debug/__pycache__/tbtools.cpython-311.pyc,,
werkzeug/debug/console.py,sha256=FIO8gDX2eQ1_4MtpJ4s0i2gR4fFCJZTPwhSVByF4kbo,6068
werkzeug/debug/repr.py,sha256=ECmIpNVlCppTfCuIuEgrJVfuhr8iDqPSWeVJyxt1QOM,9328
werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222
werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507
werkzeug/debug/shared/debugger.js,sha256=tg42SZs1SVmYWZ-_Fj5ELK5-FLHnGNQrei0K2By8Bw8,10521
werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191
werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200
werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078
werkzeug/debug/tbtools.py,sha256=8Xg7p2JzCC1AMWuse5HYc594OdzC5ToeJbNk49_zZCc,13271
werkzeug/exceptions.py,sha256=d6VNzGcVgLazIpfwRD8pN_d3yAJNyngBDFvlXQbR-38,26062
werkzeug/formparser.py,sha256=DZ9BeiHAah3_CuBORNOEipRwE74lHRFX1eK2_3XKcL4,19574
werkzeug/http.py,sha256=lR6WM_GatD5P4_y1VCix2pqDMHex73fz7TkOI3kHHwU,48712
werkzeug/local.py,sha256=zrXlO1IP3KTz310h9LSdVKMaFsJfNyXkfCYCkbvlBXQ,22075
werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
werkzeug/middleware/__pycache__/__init__.cpython-311.pyc,,
werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc,,
werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc,,
werkzeug/middleware/__pycache__/lint.cpython-311.pyc,,
werkzeug/middleware/__pycache__/profiler.cpython-311.pyc,,
werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc,,
werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc,,
werkzeug/middleware/dispatcher.py,sha256=6ltzPtDsIdLTY_T1GW6kxBJL0KZftbipa_WVdKtpVQ8,2601
werkzeug/middleware/http_proxy.py,sha256=vsSvt84m656x3mV_Fj78y7O2eYHmurWngErTcjeiz8U,7833
werkzeug/middleware/lint.py,sha256=6CqcwMWro1p-GRUGPgQ1n21KFnTTqc6-81CGTzpcK74,13916
werkzeug/middleware/profiler.py,sha256=KKr8nAiF9dr9pNd3G0D3xs7mUba9gvWkyK7X9ceke70,4906
werkzeug/middleware/proxy_fix.py,sha256=dcOOSjSok2QsSh1VSNsw-a0Vy_Jn5DunlO6PRbXBq0A,6754
werkzeug/middleware/shared_data.py,sha256=DeM8OouhfhZs8w5T7Wxw-uKuOHXoH0x5RopzxR2RRjI,9513
werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819
werkzeug/routing/__pycache__/__init__.cpython-311.pyc,,
werkzeug/routing/__pycache__/converters.cpython-311.pyc,,
werkzeug/routing/__pycache__/exceptions.cpython-311.pyc,,
werkzeug/routing/__pycache__/map.cpython-311.pyc,,
werkzeug/routing/__pycache__/matcher.cpython-311.pyc,,
werkzeug/routing/__pycache__/rules.cpython-311.pyc,,
werkzeug/routing/converters.py,sha256=V8e_wMRop6WG4Kymu4pBIR8OrJl-ZUQUZlinUXfw7WE,7602
werkzeug/routing/exceptions.py,sha256=yGZ5AUL-buHp-vK8AJbZ0bLIbSckh1UyiGKgRg4ZjaA,4698
werkzeug/routing/map.py,sha256=2tirw9j5wypzsUT6WBcBNcBTqNp0_iBXnF_1vhY9HjI,37403
werkzeug/routing/matcher.py,sha256=FyPG45iqR1XwxFujejSqfNEKV7IgbR2td7Jp-ocSASY,7817
werkzeug/routing/rules.py,sha256=dq0NO-0ZVG3OX7-8FFd0S-bZUgyzGoF4JYnlYC5bpy4,32048
werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
werkzeug/sansio/__pycache__/__init__.cpython-311.pyc,,
werkzeug/sansio/__pycache__/http.cpython-311.pyc,,
werkzeug/sansio/__pycache__/multipart.cpython-311.pyc,,
werkzeug/sansio/__pycache__/request.cpython-311.pyc,,
werkzeug/sansio/__pycache__/response.cpython-311.pyc,,
werkzeug/sansio/__pycache__/utils.cpython-311.pyc,,
werkzeug/sansio/http.py,sha256=mKTbXo_squCAZKjt9yzfPFV8ZqQbfa6mjdc6XoeLNZ0,6234
werkzeug/sansio/multipart.py,sha256=VTP_jhRRxYDX-1_1oge_b2CK3KTLnw3LB0k8b2zpiHI,11087
werkzeug/sansio/request.py,sha256=wEeVGySwlOfJT5xlgQzjJOe2ksky70CJT75QTzkvfqM,24243
werkzeug/sansio/response.py,sha256=WSsWrz-6FjtrRKun3Ha0a4sF78Su0kp8IzfrgmU_WOI,29011
werkzeug/sansio/utils.py,sha256=LYgmrN7yr04ZDVk5flPcUJLo1rDnTzhF04OH3-ujCWQ,4950
werkzeug/security.py,sha256=gEH8qD5Ykgn6W6PgMx2CQx-iNqJFenXXqOGiWDi_3eE,5814
werkzeug/serving.py,sha256=Ql_SUZxsmQzN8OZ-hDvKFQ5nRgKh6FEIYwcXVEmD6qU,39224
werkzeug/test.py,sha256=OVpg33rnFwDJ5Jya7639PKztEB7N32WAoQTVqH1p6zo,55645
werkzeug/testapp.py,sha256=w9AdbZcmSvydD-OP6EjxVENuaZof9MkbYNFVALhcoqQ,6151
werkzeug/urls.py,sha256=Uq_cu8TmZFHkQ7t2pp9DNwDvs6wG76jzWPstQIssPVk,45683
werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416
werkzeug/utils.py,sha256=DYkOtfDR_Wc3ro3_peReo9KkUC-6yhOvz27_PUAckbA,24654
werkzeug/wrappers/__init__.py,sha256=kGyK7rOud3qCxll_jFyW15YarJhj1xtdf3ocx9ZheB8,120
werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc,,
werkzeug/wrappers/__pycache__/request.cpython-311.pyc,,
werkzeug/wrappers/__pycache__/response.cpython-311.pyc,,
werkzeug/wrappers/request.py,sha256=_PIbgCZ9xfQXC9HEjm-j1R-F4gSPcx5q-QT983mMzbs,24848
werkzeug/wrappers/response.py,sha256=FfGesquK6cSdPTFZvzV42CM__Ohta2cxNqLBDRkAuKA,32664
werkzeug/wsgi.py,sha256=PGkhajtHnJj2NqYpYW_T8w17JJbaH8iI0wHHNkPvJKs,29153

View file

@ -0,0 +1,5 @@
Wheel-Version: 1.0
Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: true
Tag: py3-none-any

View file

@ -0,0 +1 @@
werkzeug

View file

@ -0,0 +1,222 @@
# don't import any costly modules
import sys
import os
is_pypy = '__pypy__' in sys.builtin_module_names
def warn_distutils_present():
if 'distutils' not in sys.modules:
return
if is_pypy and sys.version_info < (3, 7):
# PyPy for 3.6 unconditionally imports distutils, so bypass the warning
# https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250
return
import warnings
warnings.warn(
"Distutils was imported before Setuptools, but importing Setuptools "
"also replaces the `distutils` module in `sys.modules`. This may lead "
"to undesirable behaviors or errors. To avoid these issues, avoid "
"using distutils directly, ensure that setuptools is installed in the "
"traditional way (e.g. not an editable install), and/or make sure "
"that setuptools is always imported before distutils."
)
def clear_distutils():
if 'distutils' not in sys.modules:
return
import warnings
warnings.warn("Setuptools is replacing distutils.")
mods = [
name
for name in sys.modules
if name == "distutils" or name.startswith("distutils.")
]
for name in mods:
del sys.modules[name]
def enabled():
"""
Allow selection of distutils by environment variable.
"""
which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
return which == 'local'
def ensure_local_distutils():
import importlib
clear_distutils()
# With the DistutilsMetaFinder in place,
# perform an import to cause distutils to be
# loaded from setuptools._distutils. Ref #2906.
with shim():
importlib.import_module('distutils')
# check that submodules load as expected
core = importlib.import_module('distutils.core')
assert '_distutils' in core.__file__, core.__file__
assert 'setuptools._distutils.log' not in sys.modules
def do_override():
"""
Ensure that the local copy of distutils is preferred over stdlib.
See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401
for more motivation.
"""
if enabled():
warn_distutils_present()
ensure_local_distutils()
class _TrivialRe:
def __init__(self, *patterns):
self._patterns = patterns
def match(self, string):
return all(pat in string for pat in self._patterns)
class DistutilsMetaFinder:
def find_spec(self, fullname, path, target=None):
# optimization: only consider top level modules and those
# found in the CPython test suite.
if path is not None and not fullname.startswith('test.'):
return
method_name = 'spec_for_{fullname}'.format(**locals())
method = getattr(self, method_name, lambda: None)
return method()
def spec_for_distutils(self):
if self.is_cpython():
return
import importlib
import importlib.abc
import importlib.util
try:
mod = importlib.import_module('setuptools._distutils')
except Exception:
# There are a couple of cases where setuptools._distutils
# may not be present:
# - An older Setuptools without a local distutils is
# taking precedence. Ref #2957.
# - Path manipulation during sitecustomize removes
# setuptools from the path but only after the hook
# has been loaded. Ref #2980.
# In either case, fall back to stdlib behavior.
return
class DistutilsLoader(importlib.abc.Loader):
def create_module(self, spec):
mod.__name__ = 'distutils'
return mod
def exec_module(self, module):
pass
return importlib.util.spec_from_loader(
'distutils', DistutilsLoader(), origin=mod.__file__
)
@staticmethod
def is_cpython():
"""
Suppress supplying distutils for CPython (build and tests).
Ref #2965 and #3007.
"""
return os.path.isfile('pybuilddir.txt')
def spec_for_pip(self):
"""
Ensure stdlib distutils when running under pip.
See pypa/pip#8761 for rationale.
"""
if self.pip_imported_during_build():
return
clear_distutils()
self.spec_for_distutils = lambda: None
@classmethod
def pip_imported_during_build(cls):
"""
Detect if pip is being imported in a build script. Ref #2355.
"""
import traceback
return any(
cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None)
)
@staticmethod
def frame_file_is_setup(frame):
"""
Return True if the indicated frame suggests a setup.py file.
"""
# some frames may not have __file__ (#2940)
return frame.f_globals.get('__file__', '').endswith('setup.py')
def spec_for_sensitive_tests(self):
"""
Ensure stdlib distutils when running select tests under CPython.
python/cpython#91169
"""
clear_distutils()
self.spec_for_distutils = lambda: None
sensitive_tests = (
[
'test.test_distutils',
'test.test_peg_generator',
'test.test_importlib',
]
if sys.version_info < (3, 10)
else [
'test.test_distutils',
]
)
for name in DistutilsMetaFinder.sensitive_tests:
setattr(
DistutilsMetaFinder,
f'spec_for_{name}',
DistutilsMetaFinder.spec_for_sensitive_tests,
)
DISTUTILS_FINDER = DistutilsMetaFinder()
def add_shim():
DISTUTILS_FINDER in sys.meta_path or insert_shim()
class shim:
def __enter__(self):
insert_shim()
def __exit__(self, exc, value, tb):
remove_shim()
def insert_shim():
sys.meta_path.insert(0, DISTUTILS_FINDER)
def remove_shim():
try:
sys.meta_path.remove(DISTUTILS_FINDER)
except ValueError:
pass

Some files were not shown because too many files have changed in this diff Show more