Django在新浪SAE中使用storage服务实现文件上传保存
上周末迁移mezzanine到SAE http://mezzanine.sinaapp.com/见上一篇- Django开源项目mezzanine迁移SAE分享 http://blog.csdn.net/wklken/article/details/7629120这周下班后的时间基本都耗在这上面了,主要是看源代码,想着下一步如何针对性修改发现相册功能无法使用,
上周末迁移mezzanine到SAE http://mezzanine.sinaapp.com/
见上一篇-
Django开源项目mezzanine迁移SAE分享
http://blog.csdn.net/wklken/article/details/7629120这周下班后的时间基本都耗在这上面了,主要是看源代码,想着下一步如何针对性修改
发现相册功能无法使用,
原因是默认使用
# Default file storage mechanism that holds media.
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
现在发现为何维护到sae,貌似必须重写存储方式(不知道想的对是不对),从前端到后面整个流程梳理完后更改之
用Python仅停留在写工具脚本层面,对django仅仅也就会写个helloworld.
最近在看The Django Book,另外买了本<Django Web开发指南>,还在路上,希望这看完后能完成搞完mezzanine.
还想加memcache,KVDB,最后优化主体,完成应用提交,到时候希望多多支持哈。
-----------------------------------------------------------------------以上废话,步入正题:
目标:实现通过表单,上传文件,并存储到sae storage中,返回访问url
目标分解:
1.实现django hello world......(汗...刚接触这玩意儿,还比较菜)
2.写个表单
3.完成表单提交测试
4.读django关于表单和文件上传的文档,实现文件到服务端,读到文件名和文件内容
5.读sae storage相关文档,实现对读到内容的存储
开始吧
1.hello world(会的jump )
貌似很久前,还没申请到 sae时有去看过一回,
Django笔记——Eclipse+pydev首个django例子helloworld
现有django在sae上已经可以运行了,所以我只需简单配置一个url专做测试用
在应用目录下建立几个文件:
index.html内容:
<html>
<head>
<title>testing page</title>
</head>
<body>
<h1>hello world!</h1>
<br>
<center>
{{value}}
</center>
</body>
</html>
hello方法:
from django.shortcuts import render_to_response
def hello(request):
return render_to_response('index.html', {"value":"hellowrold"})
在urls.py中加入
(r'^stest$', 'saeutil.test.first.hello'),
(r'^storage$', 'saeutil.test.first.save')
修改settings.py
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, "templates"),
os.path.join(os.path.dirname(__file__), 'saeutil/templates').replace('\\','/'),
)
这时候,访问
http://***.sinaapp.com/stest 可以看到helloworld了
2+3 +4表单及文件上传测试:
修改index.html内容为:
<html>
<head>
<title>testing page</title>
</head>
<body>
<h1>hello world!</h1>
<br>
<center>
{{value}}
</center>
<FORM ENCTYPE="multipart/form-data" ACTION="/storage" METHOD=POST>
File to process: <INPUT NAME="file1" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
</body>
</html>
这时候需要去看先django文档,关于表单和文件上传
https://docs.djangoproject.com/en/dev/topics/http/file-uploads/?from=olddocs
看完后,得到两条信息
A.可以通过request.FILES['file1']拉到上传文件对象(file1为表单input的name)
B.这个对象有一个方法一个属性我们会用到,read(),name
修改save方法为
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def save(request):
content = request.FILES['file1']
return render_to_response('index.html', {"value":content.name})
加入csrf_exempt原因是碰到了
解决方案文档:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf
可以简单测试下
5. SAE的storage文档
读文档http://appstack.sinaapp.com/static/doc/release/testing/service.html#storage
去应用管理页面开启storage服务
修改save方法:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def save(request):
content = request.FILES['file1']
from os import environ
online = environ.get("APP_NAME", "")
if online:
import sae.const
access_key = sae.const.ACCESS_KEY
secret_key = sae.const.SECRET_KEY
appname = sae.const.APP_NAME
domain_name = "domain-name" #刚申请的domain
import sae.storage
s = sae.storage.Client()
ob = sae.storage.Object(content.read())
url = s.put(domain_name, content.name, ob)
return render_to_response('index.html', {"value":url})
else:
return render_to_response('index.html', {"value":"save failed"})
期间发现应用管理页面的常量名和使用时不一样,dir了以下,sae.const中
['ACCESS_KEY', 'APP_HASH', 'APP_NAME', 'MYSQL_DB', 'MYSQL_HOST', 'MYSQL_HOST_S', 'MYSQL_PASS', 'MYSQL_PORT', 'MYSQL_USER', 'SECRET_KEY', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'conf', 'os']
OK,上传,刷页面
在应用管理界面:
OK,测试结束
=====================================================================================================
这仅仅是测试代码,还需要处理编码,文件类型,大小,如何保存,查询展现
异常处理也没加
就这些,后续搞完整个相册迁移再说
P.S. URL我已经注掉了哦
wklken
2012-06-08
更多推荐
所有评论(0)