forked from bton/matekasse
tests versuch 2
This commit is contained in:
parent
fdf385fe06
commit
c88f7df83a
2363 changed files with 408191 additions and 0 deletions
BIN
NFCreader.FCStd
Normal file
BIN
NFCreader.FCStd
Normal file
Binary file not shown.
396
Website/__init__.py
Normal file
396
Website/__init__.py
Normal 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}
|
BIN
Website/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
Website/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
Website/__pycache__/db.cpython-311.pyc
Normal file
BIN
Website/__pycache__/db.cpython-311.pyc
Normal file
Binary file not shown.
35
Website/db.py
Normal file
35
Website/db.py
Normal 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
14
Website/mate.db.sql.txt
Normal 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
14
Website/schema.sql
Normal 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;
|
26
Website/templates/addtag.html
Normal file
26
Website/templates/addtag.html
Normal 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>
|
8
Website/templates/adduser.html
Normal file
8
Website/templates/adduser.html
Normal 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>
|
17
Website/templates/base.html
Normal file
17
Website/templates/base.html
Normal 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>
|
26
Website/templates/change.html
Normal file
26
Website/templates/change.html
Normal 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>
|
42
Website/templates/documentation.css
Normal file
42
Website/templates/documentation.css
Normal 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;
|
||||||
|
}
|
||||||
|
|
46
Website/templates/documentation.html
Normal file
46
Website/templates/documentation.html
Normal 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> </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>
|
26
Website/templates/removetag.html
Normal file
26
Website/templates/removetag.html
Normal 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>
|
BIN
__pycache__/main.cpython-311.pyc
Normal file
BIN
__pycache__/main.cpython-311.pyc
Normal file
Binary file not shown.
BIN
flask_session/0fb22e2ed7efb66ca2703772904e52a0
Normal file
BIN
flask_session/0fb22e2ed7efb66ca2703772904e52a0
Normal file
Binary file not shown.
BIN
flask_session/2029240f6d1128be89ddc32729463129
Normal file
BIN
flask_session/2029240f6d1128be89ddc32729463129
Normal file
Binary file not shown.
BIN
flask_session/bd4956a0d8e331a0dd84b5e2c0ddce30
Normal file
BIN
flask_session/bd4956a0d8e331a0dd84b5e2c0ddce30
Normal file
Binary file not shown.
0
logs/matekasse-21-07-2023-22-01-30.log
Normal file
0
logs/matekasse-21-07-2023-22-01-30.log
Normal file
0
logs/matekasse-21-07-2023-22-02-11.log
Normal file
0
logs/matekasse-21-07-2023-22-02-11.log
Normal file
0
logs/matekasse-22-07-2023-19-53-25.log
Normal file
0
logs/matekasse-22-07-2023-19-53-25.log
Normal file
0
logs/matekasse-22-07-2023-19-53-30.log
Normal file
0
logs/matekasse-22-07-2023-19-53-30.log
Normal file
30
logs/matekasse-22-07-2023-20-10-18.log
Normal file
30
logs/matekasse-22-07-2023-20-10-18.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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] "[35m[1mGET /adduser/user?username=testtesttesttest HTTP/1.1[0m" 500 -
|
1
logs/matekasse-22-07-2023-20-13-36.log
Normal file
1
logs/matekasse-22-07-2023-20-13-36.log
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2023-07-22 20:13:36,788 - website - INFO - Website is starting
|
7
logs/matekasse-22-07-2023-20-14-17.log
Normal file
7
logs/matekasse-22-07-2023-20-14-17.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
1
logs/matekasse-22-07-2023-20-14-58.log
Normal file
1
logs/matekasse-22-07-2023-20-14-58.log
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2023-07-22 20:14:58,598 - website - INFO - Website is starting
|
31
logs/matekasse-22-07-2023-20-17-47.log
Normal file
31
logs/matekasse-22-07-2023-20-17-47.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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] "[35m[1mGET /adduser/user?username=testtesttesttesttest HTTP/1.1[0m" 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 -
|
1
logs/matekasse-22-07-2023-20-23-06.log
Normal file
1
logs/matekasse-22-07-2023-20-23-06.log
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2023-07-22 20:23:06,581 - website - INFO - Website is starting
|
1
logs/matekasse-22-07-2023-20-23-56.log
Normal file
1
logs/matekasse-22-07-2023-20-23-56.log
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2023-07-22 20:23:56,736 - website - INFO - Website is starting
|
30
logs/matekasse-22-07-2023-20-23-58.log
Normal file
30
logs/matekasse-22-07-2023-20-23-58.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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] "[35m[1mGET /adduser/user?username=testtesttesttesttesttest HTTP/1.1[0m" 500 -
|
293
logs/matekasse-23-07-2023-21-50-15.log
Normal file
293
logs/matekasse-23-07-2023-21-50-15.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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] "[35m[1mGET /api/change?id=1&change=-1 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=3 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=3 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=-3 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=1 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=1 HTTP/1.1[0m" 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] "[35m[1mGET /api/change?id=1&change=1 HTTP/1.1[0m" 500 -
|
58
logs/matekasse-26-07-2023-17-34-29.log
Normal file
58
logs/matekasse-26-07-2023-17-34-29.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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 -
|
14
logs/matekasse-26-07-2023-19-12-31.log
Normal file
14
logs/matekasse-26-07-2023-19-12-31.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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 -
|
21
logs/matekasse-26-07-2023-19-59-28.log
Normal file
21
logs/matekasse-26-07-2023-19-59-28.log
Normal 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 - [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* 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 - [33mPress CTRL+C to quit[0m
|
||||||
|
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
0
mocker.spy
Normal file
43
nfcreader.py
Normal file
43
nfcreader.py
Normal 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
0
tests/__init__.py
Normal file
BIN
tests/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
tests/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
tests/__pycache__/conftest.cpython-311-pytest-7.4.0.pyc
Normal file
BIN
tests/__pycache__/conftest.cpython-311-pytest-7.4.0.pyc
Normal file
Binary file not shown.
BIN
tests/__pycache__/test.cpython-311-pytest-7.4.0.pyc
Normal file
BIN
tests/__pycache__/test.cpython-311-pytest-7.4.0.pyc
Normal file
Binary file not shown.
BIN
tests/__pycache__/test.cpython-311.pyc
Normal file
BIN
tests/__pycache__/test.cpython-311.pyc
Normal file
Binary file not shown.
BIN
tests/__pycache__/test_conf.cpython-311-pytest-7.4.0.pyc
Normal file
BIN
tests/__pycache__/test_conf.cpython-311-pytest-7.4.0.pyc
Normal file
Binary file not shown.
BIN
tests/__pycache__/test_website.cpython-311-pytest-7.4.0.pyc
Normal file
BIN
tests/__pycache__/test_website.cpython-311-pytest-7.4.0.pyc
Normal file
Binary file not shown.
14
tests/data.sql
Normal file
14
tests/data.sql
Normal 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;
|
BIN
tests/flask_session/2029240f6d1128be89ddc32729463129
Normal file
BIN
tests/flask_session/2029240f6d1128be89ddc32729463129
Normal file
Binary file not shown.
38
tests/test_conf.py
Normal file
38
tests/test_conf.py
Normal 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
92
tests/test_website.py
Normal 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
247
venv/bin/Activate.ps1
Normal 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
69
venv/bin/activate
Normal 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
26
venv/bin/activate.csh
Normal 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
69
venv/bin/activate.fish
Normal 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
8
venv/bin/coverage
Executable 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
8
venv/bin/coverage-3.11
Executable 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
8
venv/bin/coverage3
Executable 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
8
venv/bin/flask
Executable 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
8
venv/bin/pip
Executable 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
8
venv/bin/pip3
Executable 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
8
venv/bin/pip3.11
Executable 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
8
venv/bin/py.test
Executable 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
8
venv/bin/pytest
Executable 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
1
venv/bin/python
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/usr/bin/python
|
1
venv/bin/python3
Symbolic link
1
venv/bin/python3
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
python
|
1
venv/bin/python3.11
Symbolic link
1
venv/bin/python3.11
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
python
|
|
@ -0,0 +1 @@
|
||||||
|
pip
|
|
@ -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.
|
118
venv/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA
Normal file
118
venv/lib/python3.11/site-packages/Flask-2.3.2.dist-info/METADATA
Normal 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
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.40.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[console_scripts]
|
||||||
|
flask = flask.cli:main
|
|
@ -0,0 +1 @@
|
||||||
|
flask
|
|
@ -0,0 +1 @@
|
||||||
|
pip
|
|
@ -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.
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.40.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
flask_socketio
|
|
@ -0,0 +1 @@
|
||||||
|
pip
|
|
@ -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.
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.37.1)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
[babel.extractors]
|
||||||
|
jinja2 = jinja2.ext:babel_extract[i18n]
|
|
@ -0,0 +1 @@
|
||||||
|
jinja2
|
|
@ -0,0 +1 @@
|
||||||
|
pip
|
|
@ -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.
|
|
@ -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('<script>alert(document.cookie);</script>')
|
||||||
|
|
||||||
|
>>> # 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>"World"</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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
markupsafe
|
|
@ -0,0 +1 @@
|
||||||
|
pip
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
Wheel-Version: 1.0
|
||||||
|
Generator: bdist_wheel (0.40.0)
|
||||||
|
Root-Is-Purelib: true
|
||||||
|
Tag: py3-none-any
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
werkzeug
|
BIN
venv/lib/python3.11/site-packages/__pycache__/py.cpython-311.pyc
Normal file
BIN
venv/lib/python3.11/site-packages/__pycache__/py.cpython-311.pyc
Normal file
Binary file not shown.
222
venv/lib/python3.11/site-packages/_distutils_hack/__init__.py
Normal file
222
venv/lib/python3.11/site-packages/_distutils_hack/__init__.py
Normal 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
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue