Flask中redirect()默认302,需return返回;Django redirect()支持模型、URL名等参数并自动reverse;301需显式指定,误用会导致缓存问题;带参跳转应使用url_for()或reverse()避免手动拼接。

Flask里用redirect()返回302跳转最简单
默认就是302,不用额外指定状态码。它适合临时跳转,比如表单提交后防重复刷新,或者用户没登录时跳转到登录页。
常见错误是直接写return redirect('/login')却忘了函数得有return——不写就变成返回None,Flask会报TypeError: The view function did not return a valid response。
- 必须在视图函数里用
return redirect(...),不能只调用不返回 - 路径支持相对(
'/dashboard')和绝对('https://example.com'),但跨域跳转要注意浏览器限制 - 如果目标URL含中文或特殊字符,Flask会自动编码,不用手动调
urllib.parse.quote
Django中redirect()默认也是302,但参数更灵活
它能接受模型实例、命名URL、带参数的URL名,底层自动调reverse()生成路径。比手拼字符串安全,也避免硬编码URL。
容易踩的坑是传错参数类型:比如传了MyModel.objects.get(id=1)但该实例没定义get_absolute_url()方法,就会抛AttributeError: 'MyModel' object has no attribute 'get_absolute_url'。
立即学习“Python免费学习笔记(深入)”;
- 传模型实例:要求模型有
get_absolute_url()方法 - 传URL名:如
redirect('user_detail', pk=123),确保URL配置里真有叫user_detail的name - 想发301?得显式加
permanent=True参数,否则永远是302
需要301永久重定向?别硬改状态码,用对应参数
301会影响SEO和浏览器缓存,改完可能要等半天才生效,所以别随便切。Flask没有内置301专用函数,得写return redirect('/new-path', code=301);Django则用redirect(..., permanent=True)。
一个典型误用场景:上线新域名后,把所有旧路径都设成301跳转。结果发现部分页面加载变慢——因为浏览器缓存了301响应,即使后端修复了逻辑,用户本地仍强制跳转,清缓存才能测真实行为。
- Flask:状态码必须是
int,写code='301'会报TypeError - Django:
permanent=True等价于code=301,但不能同时传code和permanent - 测试301是否生效,用
curl -I看Location头和状态码,别只靠浏览器地址栏
重定向时带参数?别拼URL,用url_for()或reverse()
手拼'/search?q=' + query既危险又难维护。URL编码漏了会出400 Bad Request,特殊字符还可能被WAF拦截。
Flask里统一用url_for('search_view', q=query),Django用reverse('search-url', kwargs={'q': query})。它们自动处理编码、命名空间和参数格式。
- Flask的
url_for()在模板里也能用,前后端URL逻辑一致 - Django的
reverse()如果URL名不存在或参数缺字段,运行时报NoReverseMatch - 重定向目标是外部链接时,这两个函数不适用,只能手拼,但务必检查协议是否完整(
https://不能少)
状态码选301还是302不是看“听起来哪个更正式”,而是看跳转是否真的永久不变。一旦发了301,后续想改回302或换路径,用户端缓存会让这事变得特别麻烦。










