You need to enable JavaScript to run this app. Python requests登录论坛后Flask重定向显示未授权问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 06:45:09