GAE标准环境Python2.7中POST请求返回500错误求助
解决GAE标准环境Python2.7中请求Google Play评论返回500的问题
嘿,我之前也碰到过GAE环境下调用第三方API的类似坑,你的情况大概率是GAE的请求限制或者请求头差异导致的,咱们一步步来排查解决:
1. 先搞定requests在GAE的适配问题
GAE Python2.7标准环境默认不允许直接用基于socket的HTTP客户端,而requests默认用的是urllib3的socket实现,这很可能是请求失败的核心原因。你得让requests适配GAE的urlfetch服务才行:
- 首先在
app.yaml里添加依赖库:
runtime: python27 api_version: 1 threadsafe: true handlers: - url: /.* script: main.app libraries: - name: requests version: "2.20.0" # 选你项目用的requests版本 - name: requests-toolbelt version: "0.9.1" # 适配GAE的工具库
- 然后修改代码,用
requests-toolbelt的适配器创建session:
import requests from requests_toolbelt.adapters.appengine import AppEngineAdapter # 配置session使用GAE的urlfetch服务 session = requests.Session() session.mount('https://', AppEngineAdapter()) session.mount('http://', AppEngineAdapter()) ReviewsURL='https://play.google.com/store/getreviews' payload = { 'reviewType': '0' , 'pageNum': 0 , 'id': 'net.one97.paytm' , 'reviewSortOrder': '0' , 'xhr':'1' } # 用配置好的session发送请求 r = session.post( url=ReviewsURL, data=payload, headers={ 'X-Requested-With': 'XMLHttpRequest' } ) print r.text.encode('cp850', errors='replace').decode("unicode-escape")
2. 补充完整请求头,模拟真实浏览器
Google Play的API大概率会检测请求来源,GAE默认的请求头带有明显的服务器标识,容易被拦截。你可以把请求头补得更像真实浏览器:
headers={ 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
3. 检查GAE的配额与日志
- 去GAE控制台的「配额」页面看看,有没有超出
urlfetch的每日请求次数或带宽限制,配额不足也会导致请求失败。 - 一定要看GAE的日志(Stackdriver)!里面会有500错误的具体细节,比如是请求被拦截、还是服务端报错,这能帮你快速定位问题。
4. 备选方案:直接用GAE原生urlfetch API
如果上面的方法都没效果,试试直接用GAE提供的urlfetch模块,兼容性拉满:
from google.appengine.api import urlfetch import urllib ReviewsURL='https://play.google.com/store/getreviews' payload = { 'reviewType': '0' , 'pageNum': 0 , 'id': 'net.one97.paytm' , 'reviewSortOrder': '0' , 'xhr':'1' } payload_data = urllib.urlencode(payload) headers = { 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } try: result = urlfetch.fetch( url=ReviewsURL, payload=payload_data, method=urlfetch.POST, headers=headers, follow_redirects=True ) if result.status_code == 200: print result.content.encode('cp850', errors='replace').decode("unicode-escape") else: print f"请求失败,状态码: {result.status_code}" except urlfetch.Error as e: print f"请求出错: {str(e)}"
内容的提问来源于stack exchange,提问作者srbhmitt
相关产品推荐
相关产品推荐

