如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
我有一个shell脚本循环遍历包含URL的文本文件:我想访问并截取屏幕截图.
这一切都做得很简单.该脚本初始化一个类,该类在运行时创建列表中每个站点的屏幕截图.有些站点需要非常长的时间来加载,有些站点可能根本没有加载.所以我想将screengrabber-function包装在一个超时脚本中,False如果它在10秒内无法完成,则使函数返回.
我满足于最简单的解决方案,也许设置一个异步计时器,无论在函数内部实际发生什么,它将在10秒后返回False?
我有读取这样的网址的代码:
from urllib2 import Request, urlopen
req = Request(url)
for key, val in headers.items():
req.add_header(key, val)
res = urlopen(req, timeout = timeout)
# This line blocks
content = res.read()
Run Code Online (Sandbox Code Playgroud)
超时适用于urlopen()调用.但是然后代码进入res.read()调用,我想要读取响应数据,并且不会在那里应用超时.因此,读取调用可能几乎永远挂起,等待来自服务器的数据.我发现的唯一解决方案是使用一个信号来中断read(),因为我正在使用线程,所以不适合我.
还有哪些其他选择?是否有用于处理读取超时的Python的HTTP库?我看过httplib2和请求,他们似乎遇到了与上面相同的问题.我不想使用套接字模块编写自己的非阻塞网络代码,因为我认为应该已经有了一个库.
更新:以下解决方案都没有为我做.您可以自己查看设置套接字或urlopen超时在下载大文件时无效:
from urllib2 import urlopen
url = 'http://iso.linuxquestions.org/download/388/7163/http/se.releases.ubuntu.com/ubuntu-12.04.3-desktop-i386.iso'
c = urlopen(url)
c.read()
Run Code Online (Sandbox Code Playgroud)
至少在使用Python 2.7.3的Windows上,超时被完全忽略.
当用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)
问题是,如何为下载设置时间限制?
我正在使用一些看起来像这样的Python:
HOST = '127.0.0.1'
PORT = 43434
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
single.bind((HOST, PORT))
except socket.error as e:
# Print an error, exit.
Run Code Online (Sandbox Code Playgroud)
虽然它在过去运作良好,但我们现在得到了错误[Errno 98] Address already in use.SIGINT处理程序关闭套接字连接,所以我不确定它是如何进入该状态的,但是现在我只是想修复它.
两者lsof并netstat说没有使用该端口:
[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434
Run Code Online (Sandbox Code Playgroud)
TIME_WAIT根据/proc/sys/net/ipv4/tcp_fin_timeout,设置为60秒,但错误发生在上次成功运行后数小时.
我试过(暂时)设置REUSEADDR(通过single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)),但似乎没有效果.
什么在tarnation正在发生?我是否能够再次使用此端口而无需重启机器?
当我运行服务器并尝试加载本地版本的Web应用程序时,在Django 1.5.1(和1.5.0)和mysql中抛出以下DatabaseError:
/的DatabaseError /
在线程中创建的DatabaseWrapper对象只能在同一个线程中使用.具有别名'default'的对象是在线程ID 4365488128中创建的,这是线程ID 140735183980896.
例外位置如下:
/Users/USERNAME/.envs/PROJECT_NAME/lib/python2.7/site-packages/django/db/backends/ init .py in validate_thread_sharing,第154行
这仅在第一页加载时发生.当我点击刷新时,Web应用程序按预期加载.当我改变Django/python代码并且本地服务器需要重新验证时,错误返回.当发生这种情况时,第一次加载再次抛出DatabaseError,后续加载再次抛出.
这个问题只发生在我的Django 1.5项目上.我已经卸载了mysql并清除了位于/ usr/local/var/mysql中的mysql二进制文件.全新安装的mysql还没有解决这个问题.
这里讨论类似的DatabaseError,但我无法遵循他们的解决方案:
https://code.djangoproject.com/ticket/17998
我在这里不知所措,任何想法或专业知识都将受到赞赏.谢谢.
我用 python 编写了一个爬虫,根据一些给定的网址从网站下载一些网页。我注意到我的程序有时会挂在“conn.getresponse()”这一行。没有抛出任何异常,程序只是永远在那里等待。
conn = httplib.HTTPConnection(component.netloc)
conn.request("GET", component.path + "?" + component.query)
resp = conn.getresponse() #hang here
Run Code Online (Sandbox Code Playgroud)
我读了 api 文档,它说(添加超时):
conn = httplib.HTTPConnection(component.netloc, timeout=10)
Run Code Online (Sandbox Code Playgroud)
但是,它不允许我“重试”连接。超时后重试爬网的最佳做法是什么?
例如,我正在考虑以下解决方案:
trials = 3
while trials > 0:
try:
... code here ...
except:
trials -= 1
Run Code Online (Sandbox Code Playgroud)
我的方向正确吗?
我已经通过阅读http://www.mobify.com/blog/http-requests-are-hard/和http://docs.python-requests.org/en/latest/api/#requests.request到更好地了解超时.基于此我可以看到有连接超时:
connect_timeout = 0.0001
try:
response = requests.get(url="https://httpbin.org/delay/5",
timeout=(connect_timeout, 10.0))
except requests.exceptions.ConnectTimeout as e:
print "Too slow Mojo!"
Run Code Online (Sandbox Code Playgroud)
并读取超时:
read_timeout = 1.0
try:
response = requests.get(url="https://httpbin.org/delay/5",
timeout=(10.0, read_timeout))
except requests.exceptions.ReadTimeout as e:
print "Waited too long between bytes."
Run Code Online (Sandbox Code Playgroud)
如果响应未在特定时间内完成,我也有兴趣让请求模块"放弃".我不确定这种超时的用语是什么.我怎么会这样呢?
以下两行代码将永远挂起:
import urllib2
urllib2.urlopen('https://www.5giay.vn/', timeout=5)
Run Code Online (Sandbox Code Playgroud)
这是python2.7,并且没有设置http_proxy或任何其他env变量。任何其他网站都可以正常工作。我也可以毫无问题地获取该网站。可能是什么问题?
python ×8
http ×2
python-2.7 ×2
sockets ×2
timeout ×2
decorator ×1
django ×1
django-1.5 ×1
linux ×1
mysql ×1
networking ×1
nonblocking ×1
urllib2 ×1
urllib3 ×1