henlo
This commit is contained in:
parent
7c4b8214ca
commit
c5c10416c3
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
FROM alpine/sqlite
|
||||
WORKDIR /app
|
||||
RUN sqlite3 chatroom.db -cmd 'create table messages (id INTEGER PRIMARY KEY NOT NULL, message TEXT NOT NULL, timestamp TEXT NOT NULL)'
|
||||
|
||||
FROM python:3.10-slim
|
||||
WORKDIR /app
|
||||
COPY --from=0 /app/chatroom.db ./
|
||||
COPY static/ static/
|
||||
COPY index.html webserver_mit_db.py ./
|
||||
|
||||
|
||||
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
# Starte den Python-Server
|
||||
CMD ["python", "webserver_mit_db.py"]
|
||||
BIN
chatroom.db
Normal file
BIN
chatroom.db
Normal file
Binary file not shown.
37
index.html
Normal file
37
index.html
Normal file
@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>twat</title>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<link rel="icon" href="static/logo.png">
|
||||
<link rel="stylesheet" type="text/css" href="static/styles.css">
|
||||
<script src="static/htmx.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="out-container">
|
||||
<div class="header-container">
|
||||
<img src="static/logo.png" height="100px">
|
||||
<h1>Twat</h1>
|
||||
</div>
|
||||
<form hx-include="find textarea" hx-post="/post" hx-target="#posts" hx-swap="afterbegin">
|
||||
<textarea id="post-box" name="data"></textarea>
|
||||
<button type="submit"> send </button>
|
||||
</form>
|
||||
<div id="posts" hx-get="/post" hx-trigger="load" hx-swap="innerHTML">
|
||||
<div class="post-container">
|
||||
<p>text in box</p>
|
||||
<sup>sent: 12:13</sup>
|
||||
</div>
|
||||
<div class="post-container">
|
||||
<p>text in box2</p>
|
||||
<sup>sent: 12:18</sup>
|
||||
</div>
|
||||
<div class="post-container">
|
||||
<p>content</p>
|
||||
<sup>sent: sent Date</sup>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
1
static/htmx.js
Normal file
1
static/htmx.js
Normal file
File diff suppressed because one or more lines are too long
BIN
static/logo.png
Normal file
BIN
static/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
29
static/styles.css
Normal file
29
static/styles.css
Normal file
@ -0,0 +1,29 @@
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.out-container {
|
||||
max-width: 500px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.header-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
button {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.post-container {
|
||||
border: solid 2px;
|
||||
border-radius: 5px;
|
||||
padding: 1em;
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
99
webserver_mit_db.py
Normal file
99
webserver_mit_db.py
Normal file
@ -0,0 +1,99 @@
|
||||
import os
|
||||
import sqlite3
|
||||
from http.server import SimpleHTTPRequestHandler, HTTPServer
|
||||
from urllib.parse import parse_qs
|
||||
from datetime import datetime
|
||||
|
||||
def get_db_connection():
|
||||
conn = sqlite3.connect('chatroom.db')
|
||||
conn.row_factory = sqlite3.Row
|
||||
return conn
|
||||
|
||||
class MyServer(SimpleHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
if self.path == "/":
|
||||
self.handle_index()
|
||||
elif self.path.startswith('/static/'):
|
||||
self.handle_static_files()
|
||||
elif self.path == "/post":
|
||||
self.do_GET_posts()
|
||||
else:
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
|
||||
def handle_index(self):
|
||||
with open('index.html', 'r') as file:
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'text/html')
|
||||
self.end_headers()
|
||||
self.wfile.write(file.read().encode())
|
||||
|
||||
def do_GET_posts(self):
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT message, timestamp FROM messages ORDER BY id DESC LIMIT 10")
|
||||
rows = cursor.fetchall()
|
||||
conn.close()
|
||||
|
||||
posts_html = "".join(
|
||||
f"""
|
||||
<div class="post-container">
|
||||
<p>{row[0]}</p>
|
||||
<sup>sent: {row[1]}</sup>
|
||||
</div>
|
||||
""" for row in rows
|
||||
)
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header("Content-type", "text/html")
|
||||
self.end_headers()
|
||||
self.wfile.write(posts_html.encode())
|
||||
|
||||
def do_POST(self):
|
||||
if self.path == "/post":
|
||||
self.handle_post_request()
|
||||
|
||||
def handle_post_request(self):
|
||||
content_length = int(self.headers['Content-Length'])
|
||||
post_data = self.rfile.read(content_length)
|
||||
form = parse_qs(post_data.decode())
|
||||
message = form.get('data', [''])[0]
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("INSERT INTO messages (message, timestamp) VALUES (?, ?)", (message, timestamp))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "text/html")
|
||||
self.end_headers()
|
||||
self.wfile.write(f"""
|
||||
<div class="post-container">
|
||||
<p>{message}</p>
|
||||
<sup>sent: {timestamp}</sup>
|
||||
</div>
|
||||
""".encode())
|
||||
|
||||
def handle_static_files(self):
|
||||
static_dir = os.path.join(os.getcwd(), 'static')
|
||||
file_path = os.path.join(static_dir, self.path[8:])
|
||||
|
||||
if os.path.exists(file_path):
|
||||
content_type = self.guess_type(file_path)
|
||||
with open(file_path, 'rb') as file:
|
||||
content = file.read()
|
||||
self.send_response(200)
|
||||
self.send_header('Content-Type', content_type)
|
||||
self.end_headers()
|
||||
self.wfile.write(content)
|
||||
else:
|
||||
self.send_response(404)
|
||||
self.end_headers()
|
||||
|
||||
if __name__ == "__main__":
|
||||
server_address = ('', 8080)
|
||||
httpd = HTTPServer(server_address, MyServer)
|
||||
print("Server gestartet auf http://localhost:8080")
|
||||
httpd.serve_forever()
|
||||
Loading…
x
Reference in New Issue
Block a user