如何处理「页面因闲置而过期」错误?网站用户生成器开发遇阻
解决Laravel网站注册请求返回「页面过期」的问题
嘿,我来帮你搞定这个问题!你碰到的「页面过期」提示,在Laravel这类框架里基本都是CSRF验证没通过导致的,你的代码思路方向对,但细节上有几个小问题,咱们调整一下就能解决。
问题出在哪?
你现在的代码把XSRF-TOKEN直接放到请求头里,但Laravel默认认的是这两种方式:
- 表单参数里的
_token(页面注册表单里的隐藏字段) - 请求头里的
X-XSRF-TOKEN(注意是X-开头的,不是你用的XSRF-TOKEN)
而且你之前的POST请求是空的,没有提交任何注册必填字段,框架自然会判定请求无效。
修改后的完整代码
import requests from bs4 import BeautifulSoup with requests.Session() as s: # 第一步:访问注册页面,既获取cookie,也提取页面里的CSRF token register_page = s.get('http://www.watchill.org/register') soup = BeautifulSoup(register_page.content, "html.parser") # 从页面的隐藏表单字段里拿Laravel需要的_token csrf_token = soup.find('input', {'name': '_token'})['value'] # 配置请求头,保持正常的User-Agent即可 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 OPR/62.0.3331.116" } # 准备注册必填的表单数据,必须包含_token和网站要求的注册字段 form_data = { '_token': csrf_token, 'name': '测试用户001', # 替换成你要生成的用户名 'email': 'test_user_001@example.com', # 替换成唯一的测试邮箱 'password': 'your_secure_password', # 替换成符合要求的密码 'password_confirmation': 'your_secure_password' # Laravel注册通常需要密码确认 } # 发送POST请求,把表单数据放在data参数里(这才是表单提交的正确方式) r = s.post('http://www.watchill.org/register', headers=headers, data=form_data) # 打印响应内容看看结果 print(BeautifulSoup(r.content, "html.parser"))
几个关键细节说明
- 优先用页面里的
_token:有些网站的CSRF token会同时存在cookie和页面表单里,用页面提取的token比直接用cookie里的更可靠,避免编码问题。 - 必须提交完整表单字段:空的POST请求肯定会被拦截,你得把目标网站注册页面要求的所有必填字段都填上,比如用户名、邮箱、密码这些。
- Session的作用:
requests.Session()已经帮你自动维护了cookie的持久化,不用手动处理cookie传递,这一步你之前做的是对的。
额外的排查技巧
如果还是不行,可以试试解码cookie里的XSRF-TOKEN(因为它是URL编码的),然后加到请求头里:
import urllib.parse xsrf_token = urllib.parse.unquote(s.cookies["XSRF-TOKEN"]) headers["X-XSRF-TOKEN"] = xsrf_token
不过大部分情况下,用表单里的_token就能解决问题啦。
内容的提问来源于stack exchange,提问作者Resul Bulbul




