携带Base64编码图片重定向时出现No reverse Match错误
问题分析与解决方案
核心问题
- 重定向本质是GET请求,但你的
create_rider视图试图从request.POST中获取image参数,这完全拿不到数据 - Base64编码的图片体积大,直接作为URL参数传递会触发URL长度限制,还可能因为特殊字符(如
+、/、=)导致参数解析错误
解决方案
方案1:用Django Session暂存Base64图片(推荐)
把Base64图片存在用户session中,重定向后从session读取,避免URL传递的各种问题:
修改snap_rider视图:
@login_required def snap_rider(request): if request.method == 'POST': image = request.POST['photo_data'] # 计算图片字节大小 image_size = len(image) * 3 / 4 if image_size > 5 * 1024 * 1024: return render(request, 'rider_management/snap-rider.html', {'error_message': '图片过大,请选择更小的图片。'}) search_request_data = { "images": [image], "min_score": 0.7, "search_mode": "FAST" } response = requests.post(SEARCH_URL, json=search_request_data, headers=headers) if response.status_code == 200: data = response.json() if data == []: # 将Base64图片存入session request.session['rider_image'] = image return redirect('create_rider') else: print(f"错误: {response.status_code} - {response.text}") return render(request, 'rider_management/snap-rider.html')
修改create_rider视图:
@login_required def create_rider(request): # 从session中获取图片 image = request.session.get('rider_image') # 用完删除session中的数据,避免冗余 if image: del request.session['rider_image'] # 后续业务逻辑...
方案2:编码后作为GET参数传递(不推荐,仅适用于小图)
如果一定要用URL传递,需要对Base64字符串进行URL安全编码,同时修改视图从GET参数获取:
修改snap_rider中的重定向代码:
import urllib.parse # ... 其他代码 ... if data == []: # 对Base64字符串进行URL编码,避免特殊字符解析错误 encoded_image = urllib.parse.quote(image) return redirect(f'create_rider?image={encoded_image}')
修改create_rider视图:
@login_required def create_rider(request): # 从GET参数获取并解码 encoded_image = request.GET.get('image') image = urllib.parse.unquote(encoded_image) if encoded_image else None # 后续业务逻辑...
注意:这种方式会导致URL异常冗长,且多数服务器对URL长度有限制(通常2KB-8KB),5MB的Base64图片远超过这个阈值,所以强烈优先使用方案1。
内容的提问来源于stack exchange,提问作者Shuaib
相关产品推荐
相关产品推荐

