运行Flask项目,当前端点击按钮触发JS的HTTP的POST请求到后端时,后端对应的视图函数能够收到前端传来的数据,但运行到retrun redirect()这样的语句时,虽然后端发出了302重定向和GET两个请求,浏览器并没有自动向目标页面进行跳转。
@app.route('/proc', methods=['POST', 'GET'])
def proc():
global ips
global num
global topTen
global devs
global devState
ip_list = []
"""
获取并处理数据或文件
"""
if request.method == 'POST':
if request.files:
# print(request.files.get('file'))
file_ = request.files.get('file')
ip_list.extend(fileProcess(file_))
# print(ip_list)
else:
data_ = request.get_json()['data']['ip_list'][0]
print(data_)
ip_list.append(data_)
# Attain
ips, num, topTen, devs, devState = attain(ip_list)
print("addUp:", ips, num, topTen, devs, devState)
# 为什么不能跳转!!!???
return redirect(url_for('work'), code=302)
else:
return render_template('error.html')
在Flask中使用 redirect() 函数可以实现页面重定向。由于 redirect() 函数返回的是一个响应对象,所以在视图函数中要使用 return 关键字将其返回。如果代码中的 return redirect() 语句已经执行了,但是浏览器没有自动跳转,那么可能是浏览器拦截了这个重定向请求。在调试重定向问题时,可以考虑以下几个方面:
检查浏览器的控制台,看看有没有任何报错信息。
在服务器端的控制台查看是否有重定向的相关信息输出。
在浏览器的网络面板中查看服务器返回的响应状态码是否为 302。
如果使用的是 JavaScript 发起的请求,那么可能是浏览器的 CORS(跨域资源共享)机制导致的。可以在服务器端的视图函数中设置响应头来解决这个问题:
response = redirect(url_for('work'))
response.headers['Access-Control-Allow-Origin'] = '*'
return response