1
ityao 2014-11-21 06:33:32 +08:00
客户端上传用七牛之类的api不就可以了, 不经过自己服务器用别人的服务器管理图片之类的二进制上传和保存!(我没收广告费啊, 不过给你一种参考!)
|
3
p8p8 OP 不是说七牛去,是把AUTH都发到客户端去,口误!
|
4
p8p8 OP 另外我看到好像有一个Riak CS 开源的,这个跟七牛有什么差别吗?或者说他能完成七牛一样的工作吗?
|
5
powerfj 2014-11-21 08:22:29 +08:00
block掉是因为tornado是单进程单线程的,你这一个请求会堵住别的一般的请求,你把文件的上传指向另外一个服务器,多开几个进程,这样不会堵住一般的请求,当然如果很多人疯狂的上传文件,你的上传文件服务器肯定卡是肯定的
|
6
bingo00 2014-11-21 08:36:32 +08:00
你问题搞混了,
第一个问题上传到tornado服务器不想被阻塞掉的解决方式是要么用gunicorn开多个进程,要么直接写个单独的服务器来上传; 第二个问题你说的权限问题,服务器的权限控制肯定是你自己来写代码控制的,看你的说法,我觉得你现在都没有给自己加权限控制。 |
7
sujin190 2014-11-21 09:26:38 +08:00
tornado上传图片为什么会block啊?不应该啊
|
8
est 2014-11-21 09:58:15 +08:00
如果 generator 写的溜,可以自己改造成异步request响应。。。。比如一个chunk去yield一下。就不会阻塞整个tornado了。
tornado的阻塞是python函数级别的。gevent就好很多。原生调用级别的。 |
9
LINAICAI 2014-11-21 11:14:38 +08:00
我的解决方案 是用七牛上传图片 返回的图片地址URL存我的数据库
|
10
openroc 2014-11-21 11:55:21 +08:00
加nginx,开启upload模块,:)
|
11
clino 2014-11-21 13:59:14 +08:00
@est 那 tornado 能不能在 gevent 的 patch_all以后跑呢?这样说不定能解决楼主的问题了.
搜了一下有个gtornado https://github.com/wil/gtornado ,不过n年木有更新了 |
13
zhicheng 2014-11-21 15:02:13 +08:00
Python 的网络处理是非阻塞的,但如果你在 Handler 里用的 Python 提供 file.write 函数,这个是阻塞的。
解决办法有几种, 一是用 tornado.iostream 处理文件的读写,彻底解决问题。 二是运行多个 tornado 进程,不需要任何额外处理,一定程度上解决问题。 三是用队列保存文件,需要队列支持 HTTP 的 Pub,完全解决问题。 。 四是用 S3,Youpai,Qiniu 或者其它任何类似服务。鉴权不需要存储在客户端,只需要上传之前将文件信息提交到服务器的接口,接口生成针对文件的鉴权,客户端用这个上传到指定的服务商,彻底的完全的永远的解决问题。 我可以把四的代码给你参考一下。 |
17
p8p8 OP @zhicheng 劳烦您把四的代码,发我看看呗。给大家也一起看看,我想过用七牛的存储方案,但是还有几个其他的问题,例如我们APP的H用户发了一张图片,他不想让G用户看见,那么G就无法访问这张照片,如果H用户想让F用户能看见这张图片,F用户则能看见(浏览、访问)这张图片,所以我不知道这个在七牛能不能实现!
|
18
zhicheng 2014-11-21 18:34:00 +08:00
@p8p8
https://github.com/zhicheng/storage 把里边的参数改成你的帐户的。 只写了又拍云的,其它的也是类似,对客户端透明。你说的那种需要在请求URL加验证参数,S3 可以实现,其它的就不清楚了。 |
19
crossmaya 2014-11-21 23:14:47 +08:00
@p8p8 这纯粹是逻辑问题,和图片在哪没关系吧,图片地址限制访问可以用七牛的token + 过期时间处理,还有tornado并不支持大文件上传
|
21
p8p8 OP 不用nginx去处理了,考虑云存储方案算了,不然太折腾。
|