【问题标题】:Downloading files from amazon s3 using django使用 django 从 amazon s3 下载文件
【发布时间】:2013-05-08 10:34:39
【问题描述】:

我是 Django 框架 的新手,我试图生成一个链接以从 Amazon S3 下载文件。尝试加载模板页面时出现此错误:

Reverse for 'myapp.views.handles3downloads' with arguments '(u'README.md',)'
and keyword arguments '{}' not found.

urls.py

urlpatterns = patterns('',
    url(r'^handles3downloads/(\d+)/$', handles3downloads),
)

views.py

def handles3downloads(request, fname):
    bucket_name = 'bucketname'
    key = s.get_bucket(bucket_name).get_key(fname)
    dfilename = key.get_contents_to_filename(fname)

    wrapper = HttpResponse(file(dfilename))
    response = HttpResponse(wrapper, content_type='text/plain')
    response['Content-Length'] = os.path.getsize(dfilename)
    return response

模板文件

<a href="{% url 'myapp.views.handles3downloads' sfile.linkUrl %}">{{sfile.linkUrl}}</a>

我查看了一些有类似错误的解决方案,但对我没有帮助。谁能帮帮我。

提前谢谢

【问题讨论】:

标签: python django amazon-web-services amazon-s3


【解决方案1】:

urls.py

url(r'^handles3downloads/', handles3downloads),

views.py

def handles3downloads(request):
  fname = request.GET['filename']
  bucket_name = 'bucketname'
  key = s.get_bucket(bucket_name).get_key(fname)
  key.get_contents_to_filename('/tmp/'+key.name)
  wrapper = FileWrapper(open('/tmp/'+fname, 'rb'))
  content_type = mimetypes.guess_type('/tmp/'+fname)[0]
  response = HttpResponse(wrapper,content_type=content_type)
  response['Content-Length'] = os.path.getsize('/tmp/'+fname)
  response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(fname)

模板

<a href="/handles3downloads/?filename=file1.jpg" rel="external">Download</a>

【讨论】:

  • 如果你能告诉我们变量“s”的来源会很好。还需要返回响应,对。谢谢。
  • 's' 变量类似于 boto 2 示例中的 's3_connection' 变量:boto3.readthedocs.io/en/latest/guide/…import boto s3_connection = boto.connect_s3()bucket = s3_connection.get_bucket('mybucket', validate=False)
【解决方案2】:

Jordan 是正确的,你的 urls.py 有问题。你可以通过错误来判断。您正试图在“myapp.views.handles3downloads”上获得反向,但该反向字符串是否已被识别?试试这个。

urlpatterns = patterns('',
     url(r'^handles3downloads/([^/]+)/$', handles3downloads,
     name='myapp.views.handles3downloads'),
)

【讨论】:

    【解决方案3】:

    urls.py 文件中的正则表达式似乎有误。尝试改用这个:

    url(r'^handles3downloads/(\w+)/$', handles3downloads),
    

    您将参数字符串传递给视图,regex 匹配整数。

    【讨论】:

    • 嗨,更改正则表达式后我仍然遇到同样的错误
    • 那么您可能没有具有这样名称的 URL 模式。 Consider naming your view,而不是使用 `myapp.views.handles3downloads'。
    猜你喜欢
    • 2012-10-10
    • 2012-08-29
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多