在Django模板中获取正确的URL

时间:2013-11-28 08:08:49

标签: python html django django-templates

我想为用户提供几个可供下载的文件。我试过这样,但Django试图打开这个网址:

http://10.0.3.186:8000/var/www/openvpn/examples/easy-rsa/2.0/keys/first_key.key

我改变了我的模板行:

<td width="100%" align = "right">
 <a href="http://10.0.3.186:8000/sslcert/{{ file }}/key_download">
  <font color = "white">&nbsp&nbspSSL-Key&nbsp&nbsp</font>
 </a>
</td>

我将以下行添加到我的网址

url(r'^(?P<username>\w+)/key_download$', views.key_download, name='key_download')

我的观点看起来像这样

from django.utils.encoding import smart_str

def key_download(request, username):
    username_key = username + ".key"
    response = HttpResponse(mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(username_key)
    response['X-Sendfile'] = smart_str("/var/www/openvpn/examples/easy-rsa/2.0/keys")
    return response

文件正在下载,文件名是正确的,但目前它没有显示任何内容。

3 个答案:

答案 0 :(得分:1)

您还需要将响应的HTTP header设置为application/force-download。请参阅docs

另见this问题。

答案 1 :(得分:0)

/var/www不是网址。它是服务器上的文件路径。如果您希望用户访问该目录中的文件,您必须配置Apache(或其他)在特定地址提供服务,然后在模板而不是文件路径中使用该URL。

答案 2 :(得分:0)

我现在解决了这个问题。

def key_download(request, username):
    username_key = username +".key"
    fsock = open('/var/www/openvpn/examples/easy-rsa/2.0/keys/'+username_key, 'r')
    response = HttpResponse(fsock, mimetype='application/pgp-keys')
    response['Content-Disposition'] = "attachment; filename = %s " % (username_key)
    return response

对于想要找出mimetype

的人来说,这是一个很酷的提示
>>> import urllib, mimetypes
>>> url = urllib.pathname2url(filename)
>>> print mimetypes.guess_type(url)