1
\$\begingroup\$

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!

\$\endgroup\$

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.