短链接生成核心逻辑是将长url映射为短码并反查,推荐用md5哈希+base64.urlsafe_b64encode截取前6位生成短码,保证相同url产出相同短链;flask需设计/shorten(post)和/(get重定向)两个路由,严格校验短码长度与字符范围,避免安全风险。

短链接生成的核心逻辑怎么写
核心就两件事:把长 URL 映射成短字符串,再把短字符串反查回原 URL。不依赖数据库也能起步,用 Python 字典 + 内存存储就能跑通流程,适合本地验证或轻量部署。
关键不是“怎么存”,而是“怎么生成短码”——不能用递增 ID(暴露总量)、不能纯随机(碰撞概率高)、最好可逆或可控长度。推荐用 base64.urlsafe_b64encode 对哈希值做编码,再截取前 6 位:
import hashlib import base64 <p>def gen_short_code(long_url):</p><h1>用 URL 内容哈希,保证相同链接生成相同短码</h1><pre class="brush:python;toolbar:false;">hash_bytes = hashlib.md5(long_url.encode()).digest() encoded = base64.urlsafe_b64encode(hash_bytes).decode() return encoded[:6] # 6 字符,约 64^6 ≈ 687 亿种组合
注意:hashlib.md5 足够用于非安全场景;若担心哈希冲突,可加重试逻辑(生成后查重,冲突则拼接时间戳再算一次)。
Flask 路由怎么设计才支持跳转和创建
需要两个端点:一个接收 POST /shorten 提交长链接并返回短链接;另一个 GET /<code> 做 302 重定向。别漏掉对短码的合法性校验(长度、字符范围),否则可能引发路由错误或 open redirect 风险。
示例结构:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
from flask import Flask, request, redirect, jsonify
<p>app = Flask(<strong>name</strong>)
url_map = {} # {short_code: long_url}</p><p>@app.route('/shorten', methods=['POST'])
def shorten():
long_url = request.json.get('url')
if not long_url or not long_url.startswith(('http://', 'https://')):
return jsonify({'error': 'invalid url'}), 400
code = gen_short_code(long_url)
url_map[code] = long_url
return jsonify({'short_url': f'<a href="https://www.php.cn/link/a68f59fe7b60bcaad0ddeb230f5ecdfa">https://www.php.cn/link/a68f59fe7b60bcaad0ddeb230f5ecdfa</a>}'})</p><p>@app.route('/</p><pre class="brush:php;toolbar:false;">')
def redirect_to_url(short_code):
if len(short<em>code) != 6 or not all(c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789</em>-'
for c in short_code):
return 'Not found', 404
long_url = url_map.get(short_code)
if not long_url:
return 'Not found', 404
return redirect(long_url, code=302)注意:code:short_code
../../../etc/passwd 类路径破坏逻辑。本地测试时 curl 怎么发请求
不用开前端,直接用命令行验证流程是否闭环:
- 生成短链:
curl -X POST http://localhost:5000/shorten -H "Content-Type: application/json" -d '{"url":"https://example.com/very/long/path?x=1&y=2"}' - 拿到返回的
short_url后,用浏览器或curl -I看重定向头:curl -I http://localhost:5000/abc123应返回HTTP/1.0 302 FOUND和Location: https://example.com/...
常见失败点:json 请求没带 Content-Type: application/json 头 → Flask 的 request.json 为 None;短码含非法字符(如 +、/)→ urlsafe_b64encode 已规避,但手动拼接时容易出错。
上线前必须改掉的三个硬编码
本地跑通不等于能上线。以下三处不改,服务一部署就失效:
-
https://www.php.cn/link/a68f59fe7b60bcaad0ddeb230f5ecdfa}→ 必须换成你的真实域名,比如https://lnk.example.com/{code},否则返回的短链接点不开 -
url_map = {}→ 进程重启即丢失全部映射,换成 Redis 或 SQLite。哪怕只用shelve也比纯内存强:import shelve; db = shelve.open('urls.db') -
hashlib.md5(long_url.encode())→ 如果长 URL 带用户参数(如 token),不同用户生成的短链会撞。需考虑是否加 salt 或改用用户 ID + URL 拼接哈希
最常被忽略的是协议和域名——开发时习惯写 localhost,但生成的短链接一旦分发出去,就永远绑定那个地址,后期迁移成本极高。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










