🤖
Ai回答
短网址生成源码
以下是一个简单的短网址生成服务的实现代码,使用Python和Flask框架:
基础版本(使用哈希算法)
python
import hashlib
from flask import Flask, request, redirect, jsonify
app = Flask(__name__)
存储短网址和原始网址的映射
url_mapping = {}
def generate_short_url(original_url):
使用MD5哈希生成短码
hash_object = hashlib.md5(original_url.encode())
hex_dig = hash_object.hexdigest()
取前8个字符作为短码
return hex_dig[:8]
@app.route('/shorten', methods=['POST'])
def shorten_url():
original_url = request.json.get('url')
if not original_url:
return jsonify({'error': 'URL is required'}), 400
short_code = generate_short_url(original_url)
url_mapping[short_code] = original_url
short_url = fhttp://localhost:5000/{short_code}
return jsonify({'short_url': short_url})
@app.route('/<short_code')
def redirect_to_original(short_code):
original_url = url_mapping.get(short_code)
if original_url:
return redirect(original_url)
else:
return jsonify({'error': 'Short URL not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
进阶版本(使用数据库和自增ID)
python
import sqlite3
from flask import Flask, request, redirect, jsonify
app = Flask(__name__)
DATABASE = 'url_shortener.db'
def get_db():
db = sqlite3.connect(DATABASE)
db.row_factory = sqlite3.Row
return db
def init_db():
with app.app_context():
db = get_db()
db.execute('''
CREATE TABLE IF NOT EXISTS urls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
original_url TEXT NOT NULL,
short_code TEXT NOT NULL UNIQUE
)
''')
db.commit()
def base62_encode(number):
characters = 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
base = len(characters)
result = []
if number == 0:
return characters[0]
while number 0:
result.append(characters[number % base])
number = number // base
return ''.join(reversed(result))
@app.route('/shorten', methods=['POST'])
def shorten_url():
original_url = request.json.get('url')
if not original_url:
return jsonify({'error': 'URL is required'}), 400
db = get_db()
cursor = db.cursor()
检查URL是否已存在
cursor.execute('SELECT short_code FROM urls WHERE original_url = ?', (original_url,))
existing = cursor.fetchone()
if existing:
short_code = existing['short_code']
else:
插入新URL并获取ID
cursor.execute('INSERT INTO urls (original_url, short_code) VALUES (?, ?)',
(original_url, ''))
url_id = cursor.lastrowid
生成短码
short_code = base62_encode(url_id)
更新短码
cursor.execute('UPDATE urls SET short_code = ? WHERE id = ?', (short_code, url_id))
db.commit()
db.close()
short_url = fhttp://localhost:5000/{short_code}
return jsonify({'short_url': short_url})
@app.route('/<short_code')
def redirect_to_original(short_code):
db = get_db()
cursor = db.cursor()
cursor.execute('SELECT original_url FROM urls WHERE short_code = ?', (short_code,))
url = cursor.fetchone()
db.close()
if url:
return redirect(url['original_url'])
else:
return jsonify({'error': 'Short URL not found'}), 404
if __name__ == '__main__':
init_db()
app.run(debug=True)
使用说明
1、基础版本:
使用内存存储URL映射
通过MD5哈希生成短码
简单但不适合生产环境
2、进阶版本:
使用SQLite数据库持久化存储
使用自增ID和base62编码生成短码
避免哈希冲突
检查重复URL
部署建议
1、对于生产环境,建议:
使用更强大的数据库如PostgreSQL或MySQL
添加URL验证
实现过期机制
添加统计功能(点击次数等)
使用缓存(如Redis)提高性能
添加API限流
2、可以使用Nginx或Apache作为反向代理
3、考虑使用Docker容器化部署
需要更复杂的功能或特定语言的实现,可以进一步扩展此代码。