url shortener example ultra simple

Commit 8efe145 · patx · 2025-12-16T21:31:21-05:00

Changeset
8efe145fbf6f07336d5f4c1091da7aa36bf6770d
Parents
5d85f3aef4c901606a3949daab6a9a05fe90a83a

View source at this commit

Comments

No comments yet.

Log in to comment

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>