- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Raspberry Pi 上通过 uwsgi 和 nginx 使用 Cherrypy 托管一个文件访问类型的网站。我注意到的一件事是,如果文件相当大(比方说,大约 1 GB),uwsgi 说它被信号 9 杀死。这是通过放置 cherrypy.config.update({'tools .sessions.timeout': 1000000})
但这并不能真正解决问题,因为它是一个糟糕的 hacky 解决方法,实际上并没有用。它主要只是通过使超时非常大而导致另一个问题。此外,浏览器无法非常准确地估计需要多长时间,最终会挂起一段时间(阅读:在有线连接上大约 5 分钟),然后快速开始下载。
它开始于
然后去
我的下载代码很简单,只有这一行。
return cherrypy.lib.static.serve_file(路径,"application/x-download",os.path.basename(path))
我以前的下载代码运行得不太好。
有办法解决这个问题吗?
f = 文件(路径)
cherrypy.response.headers['Content-Type'] = getType(path)[0]
返回 f
最佳答案
首先,我不得不说这是一个堆积如山的配置,CherryPy -> uWSGI -> Nginx,对于这样一个受限环境。 According to the author , 在没有特殊要求的情况下,将 CherryPy 单独用于小型应用程序是安全的。在前面添加 Nginx 增加了很多灵 active ,因此通常是有益的,但只要 CherryPy 的默认部署是标准 HTTP,我强烈建议保留两者(并且完全忘记 WSGI)。
其次,考虑到您尝试过的解决方法,您可能已经知道您的问题可能与 session 相关。这是 the quote来自有关文件下载的流媒体响应主体的文档。
In general, it is safer and easier to not stream output. Therefore, streaming output is off by default. Streaming output and also using sessions requires a good understanding of how session locks work.
它建议的是手动 session 锁定管理。了解您的应用程序的工作原理应该会引导您进行适当的锁设计。
第三个。通常有一种方法可以将处理文件下载的职责转移到 Web 服务器,基本上是通过从代理应用程序发送带有文件名的适当 header 。如果在 nginx 上它叫做 X-accel
.因此,您可以避免锁定管理的麻烦,同时仍然有 session 限制下载。
我制作了一个简单的 CherrPy 应用程序,带有两个下载选项,并将其置于 Nginx 之后。我在 Firefox 和 Chromium 中的本地 Linux 机器上播放了 1.3GiB 视频文件。共有三种方式:
http://127.0.0.1:8080/native/video.mp4
),http://test/native/video.mp4
),http://test/nginx/video.mp4
)。对于 (1) 和 (2),我在 Firefox 和 Chromium 中都有轻微的奇怪行为。 (1) 在 Firefox 上,正常运行时间为几天,我一直拥有 ~5MiB/s 的下载速度和一个满载的 CPU 内核。在新鲜的 Firefox 上没有这样的行为。 (2) 在 Chromium 上导致了几个未完成的中断下载(所有时间都在 1GiB 左右)。但总的来说,这两种浏览器都显示了大约 50-70MiB/s 的 HDD 物理性能。
对于 (3) 我在这两个方面都没有问题,相同的 50-70MiB/s 吞吐量,所以不知何故在我的小实验中它最终成为最稳定的方式。
app.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import cherrypy
DownloadPath = '/home/user/Videos'
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
}
}
class App:
@cherrypy.expose
def index(self):
return 'Download test'
@cherrypy.expose
def native(self, name):
basename = os.path.basename(name)
filename = os.path.join(DownloadPath, basename)
mime = 'application/octet-stream'
return cherrypy.lib.static.serve_file(filename, mime, basename)
@cherrypy.expose
def nginx(self, name):
basename = os.path.basename(name)
cherrypy.response.headers.update({
'X-Accel-Redirect' : '/download/{0}'.format(basename),
'Content-Disposition' : 'attachment; filename={0}'.format(basename),
'Content-Type' : 'application/octet-stream'
})
if __name__ == '__main__':
cherrypy.quickstart(App(), '/', config)
app.conf
server {
listen 80;
server_name test;
root /var/www/test/public;
location /resource {
# static files like images, css, js, etc.
access_log off;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /download {
internal;
alias /home/user/Videos;
}
}
关于python - cherrypy中的大文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227727/
当我尝试通过我的 .exe 文件从 url 下载 .pdf 文件时出现以下错误。 The server committed a protocol violation. Section=Response
我是一家非营利组织的 G Suite 管理员,刚刚发现数据导出功能,这似乎是个人帐户的外卖。 导出文件已准备好,现在可以从 Google Cloud Platform Storage 中的存储桶下载。
导航 引言 总体思路 七牛云相关的配置文件 获取七牛云上传token 相关类定义 核心代码实现 获取七牛云图片下载链接 公开空
这不是后端编程问题。我只能修改标记或脚本(或文档本身)。我在这里问的原因是因为我对适当术语的所有搜索都不可避免地导致有关编程此功能的问题和解决方案。我不是试图通过编程来强制它;我必须找出此 PDF 行
您好,我已在 Google AdSense 中注册,我想使用适用于 iOS 的 SDK,但目前我找不到 SDK 下载链接。 我的申请已获批准。 任何人都知道如何下载这个sdk。 我使用这个链接来描述如
我需要为当前在 SourceForge 上的 github 项目提供二进制文件和文档。在那里,我可以为我需要的下载提供一个目录结构,因为我必须为大约 10 个不同的操作系统提供几个版本。 github
我从 Canvas 下载绘图时遇到问题。这是我的代码: function downloadCanvas(link, canvasId, filename) { link.href =
ASP.NET 项目 我将使用 Azure 进行存储。问题(要求): 在我的项目中,我让注册用户下载文件。但我不希望用户将此下载链接分享给未注册的人(例如:我给注册用户的下载链接只能在他们的计算机上下
我编写了一个servlet,用于检查http header ,但我不知道为什么当页面加载时,它会自动开始下载。 /* * To change this template, choose To
我正在尝试将下载添加到我的网络浏览器,但遇到的问题是获取您尝试下载的文件的名称。这是我的下载代码: engine.locationProperty().addListener(new ChangeLi
我正在尝试下载网站的 html: String encoding = "UTF-8"; HttpContext localContext = new BasicHttpContext();
我制作了一个带有“开始下载”按钮的框架,用于从网站下载 JAR。 问题是每当我点击开始下载按钮时,整个框架就会卡住,直到下载完成,然后就正常了。 我该如何解决这个问题? 这是单击按钮时执行的代码 p
我得到这段代码来实现一些东西,它可以帮助我从给定的 URL 下载文件。 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSes
我正在尝试创建一个 Controller 来使用流方法下载和上传文件,在我的例子中,所有文件都作为 Blob 保存在数据库中。我阅读了 Jboss Netty 的文档,但我认为这不是我的最佳解决方案。
下载并保存文件 let destination: DownloadRequest.DownloadFileDestination = { _, _ in // var fileURL = sel
使用 htaccess 我基本上试图禁止访问该页面,即 http://example.com , 但它仍然允许人们下载文件,如果他们有直接链接即 http://example.com/hi.zip .
我正在寻求将脚本与我的控制面板集成,并且由于我是新手脚本编写者而遇到问题。我想做的是用 1 个脚本下载一个文件并解压它。 示例: wget http://example.com/example.tar
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
这个问题在这里已经有了答案: Top techniques to avoid 'data scraping' from a website database (14 个答案) 关闭 5 年前。 我有
这个问题在这里已经有了答案: Reading and parsing email from Gmail using C#, C++ or Python (6 个答案) 关闭 7 年前。 我只是想,是
我是一名优秀的程序员,十分优秀!