【发布时间】:2011-07-27 18:16:56
【问题描述】:
我需要使用 GAE 创建以下应用程序:
- 用户上传了一些文件(比如说 POST 到 myapp.appspot.com/upload);
- 我需要保存它(在数据存储中?)并返回链接;
- 根据提供的链接,用户应该能够在接下来的 5 分钟内下载文件。
我创建了以下内容:
app.yaml
application: synoext
version: 1
runtime: python
api_version: 1
handlers:
- url: /upload
script: synoext.py
- url: /file/\w+
script: synoext.py
- url: /cleanup
script: synoext.py
synoext.py
import datetime
import logging
import urlparse
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.api import urlfetch
class Files(db.Model):
file = db.BlobProperty()
added = db.DateTimeProperty(auto_now_add=True)
class UploadFile(webapp.RequestHandler):
def post(self):
logging.info('(POST) Uploading new file')
# saving file in the database
file = Files()
file.file = db.Blob(self.request.get("file"))
file.put()
self.response.out.write('http://myapp.appspot.com/' + str(file.key()))
class GetFile(webapp.RequestHandler):
def get(self, key):
file = db.get(key)
if file is not None:
self.response.headers['Content-Type'] = 'application/x-bittorrent'
self.response.out.write(file.file)
else:
self.response.set_status(404)
class Cleanup(webapp.RequestHandler):
def get(self):
'''Automatically run job (cron) to delete old records (maximum 10000)
from Files database (records, which are older than 5 minutes)
'''
fiveMinutesAgoDate = datetime.datetime.now() - datetime.timedelta(minutes=5)
q = db.GqlQuery("SELECT * FROM Files WHERE added < :1", fiveMinutesAgoDate)
results = q.fetch(10000)
db.delete(results)
self.response.out.write('{"result": true}')
application = webapp.WSGIApplication(
[('/upload', UploadFile),
('/file/(\w+)', GetFile),
('/cleanup', Cleanup)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
正确吗?方法是否正确?或者,我不应该使用数据存储吗?
更新。奇怪,但是下面的代码
def get(self, key):
file = db.get(key)
if file is not None:
如果使用了不正确的密钥,则无法正常工作。 这里有什么问题?
【问题讨论】:
标签: google-app-engine memcached google-cloud-datastore blobstore