Django重定向出现无限循环问题排查求助
问题分析与解决办法
为啥会无限循环?核心问题在这三点
重定向路径格式错误
在create_prediction_link视图里,你用了正则表达式的起始符^来拼接重定向路径:return redirect(fr'^api/predictions/{link}')redirect()需要的是实际的URL路径(比如/api/predictions/abc123),而非正则规则。带^的路径属于无效格式,Django路由会错误地把它匹配回create_prediction_link视图,直接触发循环。URL路由缺少终止符,导致误匹配
urls.py中new路径的正则没加$结尾:re_path(r'^api/predictions/new', views_fp.create_prediction_link, name='new-path-prediction'),这意味着任何以
api/predictions/new开头的URL(比如api/predictions/new_xxx)都会匹配这个视图。如果你的link值包含new相关字符,重定向后的URL会再次命中该视图,形成循环。link变量未正确处理
代码里看不到link的生成逻辑:- 若
link是固定值,重定向路径永远相同,还可能和new路径的规则重叠; - 若
link未生成有效字符串,重定向路径无效,路由会回退匹配,也容易触发循环。
- 若
怎么修复?按这几步来
修正重定向路径
删掉^符号,改用标准绝对路径格式,同时生成唯一的link(比如用UUID):@api_view(["GET"]) def create_prediction_link(request): import uuid # 生成短的唯一字符串作为link link = str(uuid.uuid4())[:8] return redirect(f'/api/predictions/{link}')完善URL路由规则
给new路径加$终止符,避免误匹配:re_path(r'^api/predictions/new$', views_fp.create_prediction_link, name='new-path-prediction'),同时把
predictions/{link}的正则写准确,确保只匹配合法的link值(比如字母数字组合):# 用命名组更清晰,方便视图接收参数 re_path(r'^api/predictions/(?P<link>[a-zA-Z0-9]+)$', views_fp.create_prediction, name='new-prediction'),对应的视图要接收
link参数:@api_view(["GET"]) def create_prediction(request, link): # 保留原有业务逻辑 from datetime import date today = date.today().strftime("%b %d, %Y") prediction_text = create_prediction_text(today) Prediction.objects.all().delete() prediction = Prediction.objects.create(prediction_text=prediction_text) serializer = PredictionSerializer(Prediction.objects.all(), context={'request': request}, many=True) return Response(serializer.data)保证
link的唯一性
必须在create_prediction_link中生成唯一的link值(比如UUID、随机字符串),别用固定值,避免路径重复导致的匹配问题。
额外小建议
- 优先用
path()替代re_path(),语法更简单,不容易出错:path('api/predictions/new', views_fp.create_prediction_link, name='new-path-prediction'), path('api/predictions/<str:link>', views_fp.create_prediction, name='new-prediction'), - 用
reverse()生成URL,不用硬编码路径,后期修改路由更方便:from django.urls import reverse @api_view(["GET"]) def create_prediction_link(request): link = str(uuid.uuid4())[:8] # 通过路由name反向生成URL return redirect(reverse('new-prediction', kwargs={'link': link}))
内容的提问来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

