patx/micropie
url shortener example ultra simple
Commit 8efe145 · patx · 2025-12-16T21:31:21-05:00
Comments
No comments yet.
Diff
diff --git a/examples/pastebin/app.py b/examples/pastebin/app.py
index d65b4cb..19658da 100644
--- a/examples/pastebin/app.py
+++ b/examples/pastebin/app.py
@@ -1,5 +1,5 @@
from micropie import App
-from mkvdb import Mkv
+from mongokv import Mkv
class Root(App):
diff --git a/examples/url_shortener/shorty/main.py b/examples/url_shortener/shorty/main.py
new file mode 100644
index 0000000..bffbd04
--- /dev/null
+++ b/examples/url_shortener/shorty/main.py
@@ -0,0 +1,28 @@
+from string import ascii_letters
+from secrets import choice
+
+from micropie import App
+from mongokv import Mkv
+
+URLROOT = "http://localhost:8000/"
+db = Mkv("mongodb://localhost:27017")
+
+
+class Shorty(App):
+
+ async def index(self, url_str: str | None = None):
+ if url_str:
+
+ if self.request.method == "POST":
+ short_id = "".join(choice(ascii_letters) for _ in range(6))
+ await db.set(short_id, url_str)
+ return await self._render_template("success.html",
+ url_id=url_str, short_id=short_id, url_root=URLROOT)
+
+ real_url = await db.get(url_str, "/")
+ return self._redirect(real_url)
+
+ return await self._render_template("index.html")
+
+
+app = Shorty()
diff --git a/examples/url_shortener/shorty/templates/index.html b/examples/url_shortener/shorty/templates/index.html
new file mode 100644
index 0000000..b487fa9
--- /dev/null
+++ b/examples/url_shortener/shorty/templates/index.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Shorten URL - Shorty</title>
+<style>
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: system-ui, -apple-system, sans-serif;
+ background:
+ radial-gradient(1200px 600px at 15% 20%, rgba(99,102,241,.25), transparent 60%),
+ radial-gradient(900px 500px at 85% 75%, rgba(34,197,94,.18), transparent 55%),
+ linear-gradient(180deg, #070b14, #0b1220 35%, #070b14);
+}
+
+form {
+ width: 90%;
+ max-width: 600px;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+input {
+ padding: 1rem;
+ font-size: 1.1rem;
+ border: 2px solid #ddd;
+ border-radius: 8px;
+}
+
+button {
+ padding: 1rem;
+ font-size: 1.1rem;
+ background: linear-gradient(135deg, rgba(99,102,241,.95), rgba(34,197,94,.75));
+ color: #fff;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+button:hover{
+ filter: brightness(1.06);
+ box-shadow: 0 16px 42px rgba(0,0,0,.42);
+}
+</style>
+</head>
+<body>
+<form method="POST" action="/">
+ <input type="url" name="url_str" placeholder="https://yourlongurl.com/here" required>
+ <button type="submit">Shorten</button>
+</form>
+</body>
+</html>
diff --git a/examples/url_shortener/shorty/templates/success.html b/examples/url_shortener/shorty/templates/success.html
new file mode 100644
index 0000000..1f9fb4f
--- /dev/null
+++ b/examples/url_shortener/shorty/templates/success.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>URL Shortened - Shorty</title>
+<style>
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: system-ui, -apple-system, sans-serif;
+ background:
+ radial-gradient(1200px 600px at 15% 20%, rgba(99,102,241,.25), transparent 60%),
+ radial-gradient(900px 500px at 85% 75%, rgba(34,197,94,.18), transparent 55%),
+ linear-gradient(180deg, #070b14, #0b1220 35%, #070b14);
+}
+
+.container {
+ width: 90%;
+ max-width: 600px;
+ text-align: center;
+}
+
+h1 {
+ font-size: 2rem;
+ margin-bottom: 2rem;
+}
+
+.url-box {
+ padding: 1.5rem;
+ background: #f5f5f5;
+ border-radius: 8px;
+ margin-bottom: 1rem;
+}
+
+.short-url {
+ font-size: 1.3rem;
+ font-weight: bold;
+ word-break: break-all;
+}
+
+button {
+ padding: 1rem;
+ font-size: 1.1rem;
+ background: linear-gradient(135deg, rgba(99,102,241,.95), rgba(34,197,94,.75));
+ color: #fff;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+}
+
+button:hover{
+ filter: brightness(1.06);
+ box-shadow: 0 16px 42px rgba(0,0,0,.42);
+}
+
+.back-link {
+ display: inline-block;
+ margin-top: 2rem;
+ color: cyan;
+ text-decoration: none;
+}
+
+.back-link:hover {
+ color: #1E90FF;
+}
+</style>
+</head>
+<body>
+<div class="container">
+ <div class="url-box">
+ <div class="short-url" id="shortUrl">{{ url_root }}{{ short_id }}</div>
+ </div>
+ <button onclick="copyUrl()">Copy Link</button>
+ <br>
+ <a href="/" class="back-link">← Shorten another</a>
+</div>
+
+<script>
+function copyUrl() {
+ const url = document.getElementById('shortUrl').textContent;
+ navigator.clipboard.writeText(url).then(() => {
+ const btn = document.querySelector('.copy-btn');
+ btn.textContent = 'Copied!';
+ setTimeout(() => btn.textContent = 'Copy Link', 2000);
+ });
+}
+</script>
+</body>
+</html>