Python requests登录论坛后Flask重定向显示未授权问题求助
问题原因分析
- 你当前的逻辑存在本质的会话隔离问题:
requests.Session()是运行在你Flask服务端的会话对象,登录成功后拿到的论坛登录凭证Cookie只存储在服务端的这个会话实例里 - 你调用
redirect()返回给用户浏览器的是跳转指令,由用户自己的浏览器访问论坛目标地址,用户浏览器根本没有存储对应的论坛登录Cookie,自然会显示未授权访问
解决方案
方案1:将服务端拿到的登录Cookie写入用户浏览器后再跳转
登录成功后,把论坛返回的登录态Cookie逐个设置到给用户的响应头里,匹配Cookie的Domain、Path等属性即可,示例修改代码如下:
from flask import make_response, Response @app.route("/protected_area") @login_is_required def protected_area(): session = requests.Session() user = fake_useragent.UserAgent().random header = CaseInsensitiveDict() header['user-agent'] = user payload = { 'mode': MODE, 'username': LOGIN, 'password': PASS } url_main = BASIC_SITE_URL + 'login' url_login = BASIC_SITE_URL + 'login/form' url_cabinet = BASIC_SITE_URL + '?perspective=pa-home' response = session.get(url_main, headers=header, allow_redirects=False) cookies = get_cookies(response.cookies, "tm.domain.com") cookies_dict = dict([c.split('=', 1) for c in cookies.split(';')]) session.cookies.update(cookies_dict) # 执行登录请求 login_resp = session.post(url_login, data=payload, cookies=cookies_dict, headers=header, allow_redirects=False) if login_resp.status_code == 200: # 构造跳转响应 resp = make_response(redirect(url_cabinet)) # 将服务端拿到的所有论坛登录Cookie写入用户浏览器 for cookie_name, cookie_value in session.cookies.items(): # 可根据实际需求补充path、max_age、secure等参数 resp.set_cookie(cookie_name, cookie_value, domain='.tm.domain.com') return resp elif login_resp.status_code == 404: return redirect(url_main)
注意:如果论坛的Cookie设置了HttpOnly、同站策略等安全限制,该方案可能失效,属于浏览器的安全规则限制无法绕过
方案2:由Flask服务端代理转发请求
如果方案1受跨域/Cookie安全策略限制无法实现,可以让Flask作为代理,服务端拿到论坛页面内容后再返回给用户,无需让用户浏览器直接访问论坛地址:
if login_resp.status_code == 200: # 服务端直接请求目标页面,携带登录态 cabinet_resp = session.get(url_cabinet, headers=header) # 原样返回页面内容和响应头 return Response(cabinet_resp.content, content_type=cabinet_resp.headers['Content-Type'])
内容的提问来源于stack exchange,提问作者Viktor Andriichuk
相关产品推荐
相关产品推荐

