2

我正在运行一个 Django 网站,我希望能够通过我的管理面板上传文件,然后让主站点的访问者能够下载它。我正在使用 Django-nonrel、Django FileTransfers 和 Google App Engine 运行我的网站。我相信上传功能可以正常工作,因为我可以在我的 App Engine Blob 存储中看到该文件。我似乎无法弄清楚如何在公共网站上显示指向指定文件的下载链接。我已经粘贴了下面的相关类:


我有一个名为日历的应用程序,它具有以下模型:

class CalendarEvent (models.Model):
    start = models.DateTimeField(auto_now=False, auto_now_add=False)
    end = models.DateTimeField(auto_now=False, auto_now_add=False)
    title = models.CharField(max_length=500)
    description = models.TextField()

    file = models.FileField(upload_to='uploads/%Y/%m/%d/%H/%M/%S/')

这是视图:

def calendar(request):
events = CalendarEvent.objects.exclude(start__lt=datetime.datetime.now()).order_by('start')
return render_to_response('home/calendar.html',{'events': events},context_instance=RequestContext(request))

def download_handler(request, pk):
    upload = get_object_or_404(CalendarEvent, pk=pk)
    return serve_file(request, upload.file, save_as=True)

这是我的管理员:

class calendarAdmin(admin.ModelAdmin):
    list_display = ('title','start','end')

admin.site.register(CalendarEvent, calendarAdmin)   

最后,这是我的模板的相关部分:

    {% for e in events %}
    {% url Calendar.views.download_handler pk=e.pk as fallback_url %}
    <a href="{% firstof e.file|public_download_url fallback_url %}">Download</a>
{% endfor %}

{% firstof e.file|public_download_url fallback_url %} 只是返回空白,我不确定我哪里出错了。

4

4 回答 4

2

根据此处的文档,GAE blob 存储不支持公共下载,因此如果您对公共下载 url 使用默认后端,它将返回 None。所以我的猜测是e.file|public_download_url总是返回无。你可以验证一下。

然后我认为你的模板是错误的。如果您的应用名为日历,则您正在尝试访问e.views.download_handler它应该在的位置。Calendar.views.download_handler

我认为 django-filetransfers 页面上的示例很容易出错,因为模板循环中使用的变量与示例应用程序具有相同的名称:“上传”。

如果这不能解决问题,您能否从日历应用程序中发布您的urls.py。如果没有映射,则模板的url方法可能无法解析 url 。Calendar.views.download_handlerurlpatterns

你应该有类似的东西

urlpatterns = patterns('Calendar.views',
    ...
    (r'^download/(?P<pk>.+)$', 'download_handler'),
    ...
)

在这个文件中。

于 2012-11-02T01:10:50.037 回答
0

我看不出有什么特别的,例如

<a href="{{ e.file.get_absolute_url }}">Download File</a>

应该工作,还是直接使用e.file.url

于 2012-10-29T20:11:06.473 回答
0

我自己没有在 Google App Engine 上进行部署,但这似乎是 django-filetransfers 的设计目的:

http://www.allbuttonspressed.com/projects/django-filetransfers#handling-downloads


编辑:我相信我已经在您发布的另一个问题中回答了这个问题,然后:Trouble downlaoding file using Django FileTransfers

于 2012-11-01T23:01:05.177 回答
0

我认为最简单的方法是编写一个视图,因为无法直接检索此文件 blob 以编写如下函数:

def file_transfer(req, calendar_event_id):
    try:
       ce = CalendarEvent.objects.get(calendar_event_id)
    except CalendarEvent.DoesNotExist:
       raise Http404()

    file = ce.file (Write Google appengine specfic routine to pull file)
    return HttpResponse(file, media_type='file content type')

将其连接到 urls.py

于 2012-11-02T13:08:00.567 回答