- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 Django 应用程序中,我使用第三方 Python script允许用户通过 EC2 实例上的 httplib.HTTPConnection.send 将文件上传到 blip.tv。由于这些文件一般都很大,我会使用消息队列异步处理上传(RabbitMQ/Celery),并在前端向用户反馈进度。
httpconnection 和 send 是在这部分脚本中完成的:
host, selector = urlparts = urlparse.urlsplit(url)[1:3]
h = httplib.HTTPConnection(host)
h.putrequest("POST", selector)
h.putheader("content-type", content_type)
h.putheader("content-length", len(data))
h.endheaders()
h.send(data)
response = h.getresponse()
return response.status, response.reason, response.read()
文件传输完成后返回了getresponse(),我如何写出进度(假设有stdout.write),以便我可以将这个值写入缓存框架进行显示(djangosnippets 678/679)?或者,如果有更好的做法,我会洗耳恭听!
编辑:
自从我使用了 urllib2 并使用了来自 this question 的提示覆盖文件的 read() 以获取上传进度。此外,我正在使用海报生成多部分 urlencode。这是最新的代码:
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def Upload(video_id, username, password, title, description, filename):
class Progress(object):
def __init__(self):
self._seen = 0.0
def update(self, total, size, name):
self._seen += size
pct = (self._seen / total) * 100.0
print '%s progress: %.2f' % (name, pct)
class file_with_callback(file):
def __init__(self, path, mode, callback, *args):
file.__init__(self, path, mode)
self.seek(0, os.SEEK_END)
self._total = self.tell()
self.seek(0)
self._callback = callback
self._args = args
def __len__(self):
return self._total
def read(self, size):
data = file.read(self, size)
self._callback(self._total, len(data), *self._args)
return data
progress = Progress()
stream = file_with_callback(filename, 'rb', progress.update, filename)
datagen, headers = multipart_encode({
"post": "1",
"skin": "xmlhttprequest",
"userlogin": "%s" % username,
"password": "%s" % password,
"item_type": "file",
"title": "%s" % title.encode("utf-8"),
"description": "%s" % description.encode("utf-8"),
"file": stream
})
opener = register_openers()
req = urllib2.Request(UPLOAD_URL, datagen, headers)
response = urllib2.urlopen(req)
return response.read()
这只适用于文件路径输入,而不是来自表单输入(request.FILES)的 InMemoryUploadedFile,因为我想它正在尝试读取已经保存在内存中的文件,并且我在线上遇到了 TypeError : "stream = file_with_callback(filename, 'rb', progress.update, filename)":
coercing to Unicode: need string or buffer, InMemoryUploadedFile found
如何实现与用户上传文件相同的进度报告?另外,像这样读取进度会不会消耗大量内存,也许是这个download progress for urllib2的上传解决方案会更好,但是如何实现...非常欢迎帮助
最佳答案
事实证明,poster库在 multipart_encode 中有一个回调 Hook ,可用于获取进度(上传或下载)。好东西...
虽然我想我在技术上回答了这个问题,但我确信还有其他方法可以给这只猫剥皮,所以如果我找到其他方法或细节,我会发布更多。
代码如下:
def prog_callback(param, current, total):
pct = 100 - ((total - current ) *100 )/ (total)
print "Progress: %s " % pct
datagen, headers = multipart_encode({
"post": "1",
"skin": "xmlhttprequest",
"userlogin": "%s" % username,
"password": "%s" % password,
"item_type": "file",
"title": "%s" % title.encode("utf-8"),
"description": "%s" % description.encode("utf-8"),
"file": filename
}, cb=prog_callback)
opener = register_openers()
req = urllib2.Request(UPLOAD_URL, datagen, headers)
response = urllib2.urlopen(req)
return response.read()
关于使用 httplib 发送 Python HTTPConnection 文件,检索进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6425320/
“AAaarg”!请帮忙!!! 这是我正在尝试做的... 我有一个 Django 站点 site1,它需要访问另一个服务 site2 的 API。然而,为了做到这一点,site1 需要使用它自己的登录
以下代码引发错误“socket.gaierror: [Errno -2] Name or service not known”。 import httplib, urllib attrs = urll
我正在尝试获取似乎重定向不止一次的页面的最终 URL。在您的浏览器中尝试这个示例 URL,并将其与我的代码片段底部的最终 URL 进行比较: Link that redirects more than
我有一个在端口 6868 上运行的本地服务器。从技术上讲,它是使用 Express 构建的由 Node.js 驱动的微型站点。它实际上有一个“/push” Controller 读取一些数据并写入控制
我使用带有私钥的httplib.HTTPSConnection: h = httplib.HTTPSConnection(url, key_file='../cert/priv.pem', cert_
我有以下代码要使用: def createCon(host,auth): con = httplib.HTTPSConnection(host) return con def _rea
我有一个脚本,它使用 Python 中的 httplib 获取互联网上很多页面的 HTTP header 。 我的问题是关于 specific domain (可能还有其他人),httplib 引发异
我正在尝试使用 httplib 将信用卡信息发送到 authorize.net。当我尝试发布请求时,我得到以下回溯: File "./lib/cgi_app.py", line 139, in run
我正在尝试弄清楚如何通过代理将数据发送到服务器。我希望这可以通过 tor 实现,但是因为 tor 使用 SOCKS,所以使用 httplib 显然不可能(如果我错了请纠正我) 这是我现在拥有的 imp
我正在使用 python 为 elgg 编写一个 REST 客户端,即使请求成功,我也会得到以下响应: Traceback (most recent call last): File "testc
我正在实现一个从各种服务器获取网页的小服务。我需要能够配置不同类型的超时。我尝试过使用套接字的 settimeout 方法,但它并不完全符合我的要求。这是问题所在。 我需要指定初始 DNS 查找的超时
我正在使用 httplib 向服务器发布帖子。我正在拿回 303 See Other。我如何查看重定向消息“303 See Other”并没有真正帮助。 谢谢 conn1 = httplib.HTTP
问题是这样的: 我有一个 Django 网站。 我正在尝试使用 httplib 向站点发送 POST 请求。 当我尝试发送 POST 请求时,Django 需要 CSRF token 。 如何才能毫无
我想编写一个 python 脚本,它将请求 reddit 帖子 url,转到页面,使用指定帐户登录并为帖子点赞和注销。 A) 这可以用 python 完成吗? B) 我该怎么做?如果您可以提供很棒的代
我想使用 HTTPS 协议(protocol)从 python 的 httplib 库发送 Get 请求。 我已经浏览了多个答案,建议如何在使用 http 协议(protocol)时执行此操作,但它们
我正在使用 suds 0.3.6。创建 suds 客户端时,随机出现错误: httplib.py,_read_status(),第 355 行,类 httplib.BadStatusLine' 这是用
我发现 httplib.HTTPSConnection 不执行自动服务器证书检查。据我了解的问题,我需要手动添加该功能,例如通过按照描述对此类进行子类化 here . 由于我使用的是 Python2.
默认情况下,httplib 调试发送、 header 和回复信息作为 logger.info 返回, 如何将发送、 header 和重播显示为调试信息的一部分? import requests imp
我想通过 HTTP GET 请求将数据发送到我的服务器,每 1-2 秒一次。 我应该每次都创建一个新连接,还是应该保持连接打开并继续通过同一连接发送请求?如果我采用后一种方法,httplib 会保持连
httplib.HTTPException 是否有错误代码?如果是这样,我如何从异常实例中获取它们?感谢您的帮助。 最佳答案 httplib 模块不使用异常来传达 HTTP 响应,只是真正的错误(无效
我是一名优秀的程序员,十分优秀!