我正在为在 Google App Engine 上运行的 Django 应用程序(普通 Django 1.4,而不是非 rel 版本)实现图像上传功能。上传的图像被包装在一个 Django 模型中,该模型允许用户添加标题和搜索标签等属性。
上传是通过函数调用创建 Blobstore 上传 url 来执行的blobstore.create_upload_url(url)
。函数参数是上传完成时 Bobstore 重定向到的 url。我希望这是默认 Django 表单处理程序的 url,该处理程序执行包装图像的模型的保存/更新,因此我不必为表单验证、错误报告和数据库更新重复默认 Django 行为。
我尝试提供reverse('admin:module_images_add')
给,create_upload_url()
但这不起作用,因为它会抛出一个[Errno 30] Read-only file system exception
. 我认为这源于默认的 Django 表单处理程序再次尝试以标准 Django 方式上传文件,但随后撞到了 Google App Engine 的砖墙,不允许访问文件系统。
目前,我认为在不重复代码的情况下使其工作的唯一方法是严格分离进程:一个用于定义图像模型实例,第二个用于上传实际图像。不是很直观。
另请参阅我之前发布的这个问题和答案。
关于如何使用一种表单和重用 Django 默认表单处理程序来使其工作的任何建议?
编辑:
我一直在阅读装饰器(我对 Python 比较陌生),从我阅读的内容来看,装饰器似乎能够修改现有 Python 代码的行为。是否可以更改现有表单处理程序的运行时行为以使用装饰器解决上述问题?我显然必须 (1) 开发装饰器并 (2) 将其附加到默认处理程序。我不确定(2)是否可能,因为它必须在运行时完成。我无法修补在 GAE 上运行的 Django 代码...