Recently, I was studying flask and my friend sent me a bit.ly link. Then the idea of a bit.ly clone struck my mind.
This project uses
- Python - 3.10.0
- flask - version 2.0.2
- Bootstrap CSS. (I am very bad at CSS)
- sqlite3
I would appreciate you thoughts and improvements on my implementation.
File directory structure -
Bit.ly Clone -
|- templates -
| - index.html
|- app.py
|- database.db
|- schema.sql
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>Url Shortener</title>
</head>
<body>
<h1>Url Shortener</h1>
<form method="post">
<div class="form-group">
<label for="URL">URL</label>
<input name="org_url" class="form-control" id="URL">
</div>
<div class="form-group">
<label for="short_url">Short URL</label>
<input name="short_url" class="form-control" id="short_url">
</div> <br>
<button type="submit" class="btn btn-primary">Create</button>
</form>
</body>
</html>
schema.sql
DROP TABLE IF EXISTS URL_Table;
CREATE TABLE URL_Table (
org_url TEXT NOT NULL,
short_url TEXT NOT NULL);
database.db
app.py
from flask import Flask, render_template, request, redirect
from werkzeug.exceptions import abort
import sqlite3
app = Flask(__name__)
database = 'database.db'
def init_db():
conn = sqlite3.connect(database)
cursor = conn.cursor()
with open('schema.sql', 'r') as file:
cursor.executescript(file.read())
conn.commit()
conn.close()
def get_db_conn():
return sqlite3.connect(database)
def get_record(short_url):
conn = get_db_conn()
cursor = conn.cursor()
record = cursor.execute('SELECT * FROM URL_Table WHERE short_url = ?', (short_url,)).fetchone()
conn.close()
return record
def create_record(org_url, short_url):
conn = get_db_conn()
cursor = conn.cursor()
cursor.execute('INSERT INTO URL_Table VALUES(?, ?)', (org_url, short_url))
conn.commit()
conn.close()
@app.route('/')
def index():
init_db()
return redirect('/create')
@app.route('/create', methods=('GET', 'POST'))
def create():
if request.method == 'POST':
create_record(request.form['org_url'], request.form['short_url'])
return render_template('index.html')
@app.route('/<string:url>')
def get_url(url):
record = get_record(url)
if record is None:
return abort(404)
return redirect(record[0])
app.run(debug=True)
Thanks!