当前位置: 首页 > 面试题库 >

Django:在自定义网址后投放媒体

江同化
2023-03-14
问题内容

此,我当然知道通过Django提供静态文件会直接将您送入地狱,但是我对如何使用自定义网址掩盖Django使用文件的真实位置感到困惑。 Django:在一般视图中提供下载服务,但我接受的答案似乎是“错误”的处理方式。

urls.py:

url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'),

views.py:

def song_download(request, song_id):
    song = Song.objects.get(id=song_id)
    fsock = open(os.path.join(song.path, song.filename))

    response = HttpResponse(fsock, mimetype='audio/mpeg')
    response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % (song.artist, song.title)

    return response

事实证明,该解决方案效果理想,但不够完美。如何在仍然通过nginx / apache服务的同时避免直接链接到mp3?

编辑1-其他信息

目前,我可以使用以下地址来获取文件: http://www.example.com/music/song/1692/download/ 但是,上述方法是魔鬼的工作。

在仍然使Nginx / apache服务媒体的同时,我如何才能实现上述目标?这是应该在Web服务器级别执行的操作吗?一些疯狂的mod_rewrite?

http://static.example.com/music/Aphex%20Twin%20-%20Richard%20D.%20James%20(V0)/10%20Logon-Rock%20Witch.mp3

编辑2-其他信息

我将nginx用于前端和反向代理后备apache /开发服务器,因此,我认为如果确实需要某种mod_rewrite工作,我将不得不找到与nginx兼容的东西。


问题答案:

为了扩展先前的答案,你应该能够修改以下代码,并让nginx直接提供你的下载文件,同时仍然保护文件。

首先添加一个位置,例如:

location /files/ {
   alias /true/path/to/mp3/files/;
   internal;
}

到你的nginx.conf文件(内部无法直接访问)。然后,你需要一个类似Django的视图:

def song_download(request, song_id):
    try:
        song = Song.objects.get(id=song_id)
        response = HttpResponse()
        response['Content-Type'] = 'application/mp3'
        response['X-Accel-Redirect'] = '/files/' + song.filename
        response['Content-Disposition'] = 'attachment;filename=' + song.filename
    except Exception:
        raise Http404
    return response

这会将文件下载交给nginx。



 类似资料:
  • 我是Django的新手 两者都 我想要以渲染在目录和以呈现在。 我已在问题/管理中注册了模型。py和安装在MyProj/settings中的应用程序。皮耶。 文件夹结构: MyProj/设置。派克 MyProj/urls.py MyProj/视图。派克 问题/网址。派克 问题/admin.py 问题/views.py 有人能告诉我我错过了什么吗?提前感谢!:)

  • 问题内容: 我有一个模特。带外键的汽车,例如。所有者,可以空白,也可以不空白。汽车有一个creation_date。 我想按日期订购这些汽车,但是如果汽车有所有者,则必须以所有者的出生日期代替汽车的creation_date。 这可能吗? 问题答案: 看看这个类似的问题:对查询集进行排序的好方法吗?-Django 您不能使用模型的元数据,因为它仅接受一个字段 https://docs.django

  • Django 自带的 User 及 auth 库为快速开发带来了很大便利,也增加了扩展其功能的难度。 Django 官方文档中是推荐使用一对一的关联 Model 来扩展 User model: class UserExtend(Model): user = OneToOneField(User, auto_create=True, relate_name='extend') fie

  • SOFARPC 中对服务地址的选择也抽象为了一条处理链,由每一个 Router 进行处理。同 Filter 一样, SOFARPC 对 Router 提供了同样的扩展能力。 @Extension(value = "customerRouter") @AutoActive(consumerSide = true) public class CustomerRouter extends Router

  • 自定义网桥 除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器。 在启动 Docker 服务的时候,使用 -b BRIDGE或--bridge=BRIDGE 来指定使用的网桥。 如果服务已经运行,那需要先停止服务,并删除旧的网桥。 $ sudo systemctl stop docker$ sudo ip link set dev docker0 down$ sudo brctl

  • 本文向大家介绍Django自定义用户表+自定义admin后台中的字段实例,包括了Django自定义用户表+自定义admin后台中的字段实例的使用技巧和注意事项,需要的朋友参考一下 1.自定义用户表 注意事项 必须在settings中配置AUTH_USER_MODEL这个字段 2.在models文件中编写UserModel类 添加完成后,在当前app的admin文件中注册 3.测试 编写完上述步骤后