真正可控的短链工具需自主掌控域名与存储逻辑,核心是url到短码的映射、持久化存储及重定向服务;推荐随机生成6位短码并用json文件安全存储,配合索引与缓存控制。

短链接生成必须自己控制域名和存储逻辑
用第三方 API(比如 tinyurl.com 或 is.gd)看似省事,但无法保证长期可用、无法审计跳转行为、更没法查重或统计点击。真正可控的短链工具,本质是一个「URL → 随机/有序字符串」的映射 + 持久化存储 + HTTP 重定向服务。Python 里最轻量的做法是用字典内存缓存 + 文件落地,适合单机小流量场景。
hashlib 生成固定长度短码不推荐用于生产
有人用 hashlib.md5(url.encode()).hexdigest()[:6] 截取哈希值当短码,问题很直接:哈希碰撞概率虽低但非零,且相同 URL 总是生成相同短码——这看似合理,实则暴露原始 URL 长度和结构,还容易被暴力反推。更麻烦的是,一旦 URL 微调(比如加个空格或斜杠),哈希就全变,导致同一资源产生多个短链。
- 真正可用的短码应满足:唯一性可验证、长度可控、无意义、支持自增或随机生成
- 推荐用
secrets.choice('abcdefghijklmnopqrstuvwxyz0123456789')随机生成 6 位,冲突时重试(配合数据库唯一索引兜底) - 若需有序可读(如
abc001),改用自增 ID 转 36 进制,但要注意并发写入竞争
Flask 路由必须区分短码和管理路径,避免 404 泛化
常见错误是把所有路径都扔进一个 @app.route('/<code>'),结果连 /static、/admin 全被劫持。正确做法是显式分离:
@app.route('/<pre class="brush:php;toolbar:false;">')
def redirect_to_url(code):
# 查映射表,302 跳转
pass
<p>@app.route('/api/shorten', methods=['POST'])
def create_short_link():</p><h1>接收原始 URL,返回新短码</h1><pre class="brush:php;toolbar:false;"><code>pass</code>关键点:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
code 路径参数不能匹配斜杠,否则 <code>/a/b会被当成一个短码,实际应拒掉- 数据库查询必须加索引在
short_code字段,否则高并发下延迟飙升 - 跳转响应头务必设
Cache-Control: no-cache,防止 CDN 缓存重定向结果
文件存储映射表时,json 格式比 pickle 更安全
用 pickle 序列化字典虽然快,但反序列化会执行任意代码——如果文件被篡改(比如注入恶意 payload),pickle.load() 就是远程代码执行入口。而 json 只能存基本类型,天然免疫。
示例写法:
# 写入
with open('links.json', 'w') as f:
json.dump({'abc123': 'https://example.com/very/long/path'}, f)
<h1>读取(带异常防护)</h1><p>try:
with open('links.json') as f:
links = json.load(f)
except (json.JSONDecodeError, FileNotFoundError):
links = {}</p>
注意:json 不支持 datetime 或自定义对象,但短链映射本就不需要这些;如果后续要加点击计数,字段也只用 int 和 str 即可。
真正麻烦的是并发写入——多个请求同时保存,文件可能被覆盖。要么加文件锁(flock),要么换 SQLite(单文件、ACID、无需额外服务)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










