flask制作一个粗糙简单的短网址功能

来源:互联网 发布:linux apache配置 编辑:程序博客网 时间:2024/04/25 07:46

for example : dwz.cn  所需后台知识
1.了解页面的元素,即所需要的一些具体的功能,做出前端的页面 框架,如index.html:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>    <form action="get_short_url" method="post">    Short URL:<input type="text" name="real_url"><input type="submit"></form></body></html>

2.了解数据库的机制,如一些简单的常规 功能,创建表单,添加一些元素内容,查找数据库的内容:

import sqlite3def init_data():    conn = sqlite3.connect('test.db')    c = conn.cursor()    c.execute('''              CREATE TABLE IF NOT EXISTS url_data              (real_url TEXT,short_id TEXT)              '''              )    conn.commit()    conn.close()def insert_data(real_url, short_id):    conn = sqlite3.connect('test.db')    c = conn.cursor()    t = (real_url, short_id)    c.execute('INSERT INTO url_data VALUES (?,?)', t)    conn.commit()    conn.close()def select_short_data(short_id):    conn = sqlite3.connect('test.db')    c = conn.cursor()    result = None    t = (short_id,)    c.execute('SELECT * FROM url_data WHERE short_id=?', t)    for row in c.fetchall():        result = row    conn.commit()    conn.close()    return resultdef select_real_data(real_url):    conn = sqlite3.connect('test.db')    c = conn.cursor()    result = None    t = (real_url,)    c.execute('SELECT * FROM url_data WHERE real_url=?', t)    for row in c.fetchall():        result = row    conn.commit()    conn.close()    return result

一个短网址的主要功能是生成一个短网址与原网址相对应,生成一个数组,当传入原网址时生成或者差找到对应的短网址,
了解转换的机制,如随机数的生成,需要注意的地方有,随机数生成的空间和随机数的重复性查重。
先生成一个简单的随机数如:

short_url = str(random.randint(0, 200000))

接下来考虑将原网址与短网址想对应传入数据库中:
首先需要get源网址:long_url = request.form[‘url’]
然后找到上传的服务域名:host = request.headers[‘HOST’],,避免域名改动的时候,发生请求错误。
接着生成随机数,将随机数与原网址对应传入相应的数据库。最后返回生成的短网址

@app.route('/get_short_url', methods=['POST'])def get_short_url():    host = request.headers['HOST']    short_id = str(random.randint(0, 200000))    insert_db(long_long_url = request.form['url']url, short_id)    return 'http://'+host + '/' + short_id

最后输入短网址的时候需要将短网址重定位,203请求跳转回原网址。需要先回数据库查找到短网址对应的原网址,后将原网址重定位:

@app.route('/<short_id>')def redirect_to_long_url(short_id):    short_url = select_db(short_id)    if short_url is None:        return 'Not Found'    return redirect(short_url[0])

如果需要查找大量的网址,难免有冲突,或者前面有人储存过,所以为了防止冲突和重复,我们需要做的是,先查询是否生成过短网址,然后如果没生成,将随机数生成优化,返回数据库查找是否重复冲突,冲突则再次重新生成一个

def random_url():    short_id = random.randint(0, 2000000)    result = select_short_data(short_id)    while result is not None:        short_id = random.randint(0, 2000000)        result = select_short_data(short_id)    return short_iddef exist_url(long_url):    result = select_real_data(long_url)    if result is not None:        return True

将功能优化后再插入原先的代码中:

@app.route('/get_short_url', methods=['POST'])def get_short_url():    host = request.headers['HOST']    long_url = request.form['real_url']    if exist_url(long_url):        short_id = select_real_data(long_url)[1]        return 'http://' + host + '/' + str(short_id)    short_id = random_url()    insert_data(long_url, short_id)    return 'http://' + host + '/' + str(short_id)@app.route('/<int:short_id>')def redirect_to_long_url(short_id):    url = select_short_data(short_id)    if short_id is None:        print('Not found')    return redirect(url[0])

完成一个短网址的功能制作,忽略页面设置。

0 0