我正在尝试在Google App Engine上使用令人敬畏的Requests库.我找到了urllib3的补丁,它请求依赖,与App Engine兼容.https://github.com/shazow/urllib3/issues/61
我能成功
import requests
Run Code Online (Sandbox Code Playgroud)
但是之后
response = requests.get('someurl')
Run Code Online (Sandbox Code Playgroud)
以下回溯失败.这是怎么回事?
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/admin/__init__.py", line 317, in post
exec(compiled_code, globals())
File "<string>", line 6, in <module>
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/api.py", line 52, in get
return request('get', url, **kwargs)
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/api.py", line 40, in request
return s.request(method=method, url=url, **kwargs)
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/sessions.py", line 208, in request
r.send(prefetch=prefetch)
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/models.py", line 458, in send
self.auth = get_netrc_auth(url)
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/utils.py", line 43, in get_netrc_auth
for loc in locations:
File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/utils.py", …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Python中实现请求重试.
它与.get()
请求的魅力相似,但.post()
无论状态代码如何,请求都不会重试.我想将它与.post()
请求一起使用.
我的代码:
from requests.packages.urllib3.util import Retry
from requests.adapters import HTTPAdapter
from requests import Session, exceptions
s = Session()
s.mount('http://', HTTPAdapter(max_retries=Retry(total=2, backoff_factor=1, status_forcelist=[ 500, 502, 503, 504, 521])))
r = s.get('http://httpstat.us/500')
r2 = s.post('http://httpstat.us/500')
Run Code Online (Sandbox Code Playgroud)
因此,.get()
请求会重试,而请求.post()
则不会.
怎么了?
使用 requests 库请求 Web 资源或网站或 Web 服务时,请求需要很长时间才能完成。该代码类似于以下内容:
import requests
requests.get("https://www.example.com/")
Run Code Online (Sandbox Code Playgroud)
此请求需要 2 多分钟(正好 2 分 10 秒)才能完成!为什么它这么慢,我该如何解决?
我想通过HTTP
协议下载文件urllib3
.我已设法使用以下代码执行此操作:
url = 'http://url_to_a_file'
connection_pool = urllib3.PoolManager()
resp = connection_pool.request('GET',url )
f = open(filename, 'wb')
f.write(resp.data)
f.close()
resp.release_conn()
Run Code Online (Sandbox Code Playgroud)
但我想知道这样做的正确方法是什么.例如,它适用于大文件,如果没有做什么,使这个代码更容易容忍和可扩展.
注意.对我来说,重要的是不要使用urllib3
库urllib2
,因为我希望我的代码是线程安全的.
我在Ubuntu机器上运行Python 2.7.6.当我twill-sh
在终端中运行(Twill是用于测试网站的浏览器)时,我得到以下内容:
Traceback (most recent call last):
File "dep.py", line 2, in <module>
import twill.commands
File "/usr/local/lib/python2.7/dist-packages/twill/__init__.py", line 52, in <module>
from shell import TwillCommandLoop
File "/usr/local/lib/python2.7/dist-packages/twill/shell.py", line 9, in <module>
from twill import commands, parse, __version__
File "/usr/local/lib/python2.7/dist-packages/twill/commands.py", line 75, in <module>
browser = TwillBrowser()
File "/usr/local/lib/python2.7/dist-packages/twill/browser.py", line 31, in __init__
from requests.packages.urllib3 import connectionpool as cpl
ImportError: No module named packages.urllib3
Run Code Online (Sandbox Code Playgroud)
但是,我可以在Python控制台中导入urllib就好了.可能是什么原因?
我写了一个脚本来调用API并在上周成功运行它.本周,它不会运行.我收到以下错误消息:
Traceback (most recent call last):
File "user_audit.py", line 2, in <module>
import requests
File "c:\Python27\lib\site-packages\requests\__init__.py", line 60, in <module>
from .packages.urllib3.exceptions import DependencyWarning
File "c:\Python27\lib\site-packages\requests\packages\__init__.py", line 29, in <module>
import urllib3
ImportError: No module named urllib3
Run Code Online (Sandbox Code Playgroud)
我已经确认软件包是最新的,尝试卸载并重新安装它,但到目前为止还没有任何工作.有人可以帮忙吗?
附录
我按照@MSHossain的建议安装了urllib3,但后来又收到了一条错误信息.新消息引用了我编写的另一个文件,该文件创建了一个Python编译文件.另一个文件是使用smptlib尝试发送电子邮件.我不明白这会发生什么,但我删除了另一个文件,我的脚本运行没有任何问题.我已经接受了下面的答案,因为我能够点击安装urllib3,但它应该已经包含在请求模块中.
我在Windows 8上使用Python 2.7 64位.我安装了Requests 2.3版.我试图运行此import语句作为在我的代码中引入重试次数的一部分:
from requests.packages.urllib3.util import Retry
Run Code Online (Sandbox Code Playgroud)
我也安装了urllib3(我刚刚通过Pip安装了它).我收到错误消息:
Traceback (most recent call last):
File "C:\Python27\counter.py", line 3, in <module>
from requests.packages.urllib3.util import Retry
ImportError: cannot import name Retry
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会这样?有没有其他依赖我不知道成功运行这行代码?
谢谢
我设置我的 cronjob 在特定时间调用我的脚本(ex- 2 4 5 10 * python3 mayank/exp/test.py)。当我的test.py被调用时,我将在我的 test.py 脚本中激活 virtualenv,如下所示。
activate = "/home/myserver/schedule_py3/bin/activate_this.py"
exec(open(activate).read())
Run Code Online (Sandbox Code Playgroud)
激活虚拟环境(其中包含 python3 和运行脚本所需的包)后,我尝试导入请求,它显示的错误为:-
File "schedule_module/Schedule/notification_task.py", line 2, in <module>
import requests
File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 43, in <module>
import urllib3
File "/usr/lib/python2.7/site-packages/urllib3/__init__.py", line 10, in <module>
from .connectionpool import (
File "/usr/lib/python2.7/site-packages/urllib3/connectionpool.py", line 31, in <module>
from .connection import (
File "/usr/lib/python2.7/site-packages/urllib3/connection.py", line 45, in <module>
from .util.ssl_ import (
File "/usr/lib/python2.7/site-packages/urllib3/util/__init__.py", line 4, in <module>
from .request …
Run Code Online (Sandbox Code Playgroud) 考虑使用 OAuth 令牌的 http 请求。访问令牌需要作为不记名包含在标头中。但是,如果令牌已过期,则需要再次请求刷新令牌,然后重试。所以自定义重试对象将如下所示:
s = requests.Session()
### token is added to the header here
s.headers.update(token_header)
retry = OAuthRetry(
total=2,
read=2,
connect=2,
backoff_factor=1,
status_forcelist=[401],
method_whitelist=frozenset(['GET', 'POST']),
session=s
)
adapter = HTTPAdapter(max_retries=retry)
s.mount('http://', adapter)
s.mount('https://', adapter)
r = s.post(url, data=data)
Run Code Online (Sandbox Code Playgroud)
重试类:
class OAuthRetry(Retry):
def increment(self, method, url, *args, **kwargs):
# refresh the token here. This could be by getting a reference to the session or any other way.
return super(OAuthRetry, self).increment(method, url, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
问题是刷新token后,HTTPConnectionPool在调用increment后仍然使用相同的header来发起请求。请参阅:https : //github.com/urllib3/urllib3/blob/master/src/urllib3/connectionpool.py#L787。尽管池的实例以增量方式传递,但更改那里的标头不会影响调用,因为它使用标头的本地副本。
这似乎是一个用例,应该经常出现请求参数在重试之间更改。 …
当用python下载大文件时,我想为时间限制设置一个时间限制,不仅适用于连接过程,还适用于下载.
我正在尝试使用以下python代码:
import requests
r = requests.get('http://ipv4.download.thinkbroadband.com/1GB.zip', timeout = 0.5, prefetch = False)
print r.headers['content-length']
print len(r.raw.read())
Run Code Online (Sandbox Code Playgroud)
这不起作用(下载没有时间限制),正如文档中正确指出的那样:https://requests.readthedocs.org/en/latest/user/quickstart/#timeouts
如果有可能,这将是伟大的:
r.raw.read(timeout = 10)
Run Code Online (Sandbox Code Playgroud)
问题是,如何为下载设置时间限制?