Django用户使用Dokku在生产中上载媒体文件

2024-06-07 15:00:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在与Django应用程序相同的主机上使用nginx为用户上传的媒体文件提供服务,而不是使用CDN或S3或类似设备

django私有存储库可用于保护登录后的媒体文件:https://github.com/edoburu/django-private-storage

我正在用Dokku部署我的Django应用程序

Dokku说,应该使用Dokku persistant存储插件来允许用户上传持久化到主机上https://dokku.com/docs~v0.9.2/advanced-usage/persistent-storage/

我的困惑是django私有存储要求您编辑nginx的配置。 具体地说,它要求您将提供服务的私有媒体的位置设置为内部。因此,未登录的用户无法从外部访问URL

dokku文档没有解释如何在应用程序登录后使用持久存储。 我真的需要django persistant存储才能写入用户上传的媒体吗

我如何组合这些解决方案,以便我的应用程序(位于容器中)能够读取和写入媒体文件,这些媒体文件由nginx提供,并且只能由登录到该应用程序的用户访问的内部位置提供服务

更新(2021年10月) 我可以部署我的应用程序,上传文件,并通过适当的URL访问它们。但我无法保护它们免受未经验证的访问

我还没有使用django私有存储或dokku持久存储。一旦文件无法访问,我计划按照以下步骤允许经过身份验证的访问:https://b0uh.github.io/protect-django-media-files-per-user-basis-with-nginx.html

我创建了一个保存到/home/dokku/backend/nginx.conf.d的文件my_conf.conf

其中包含

location /protected/ {
    internal;
    alias /home/dokku/backend/;
}

然后重新启动Nginx

我实际上看不到主机上任何地方的图像,但如果我运行dokku enter backend,那么我的文件就在“/mediafiles/testuploads/”下的容器中

这里是settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')
MEDIA_URL = '/media/'

和models.py

class User(AbstractUser):
    profile_image = models.ImageField(upload_to='testuploads/', null=True)

Tags: 文件django用户httpsgithubcombackend应用程序
1条回答
网友
1楼 · 发布于 2024-06-07 15:00:12

让我们自己做吧

您可以使用检查身份验证的自定义视图提供您的个人资料图像

您可以实现所需的功能,而无需附加依赖项。作为奖励,您将了解整个过程

因此,您需要:

  1. urls.py中添加一个类似/profiles/<int:user_id>/image/的路径
  2. 将此链接与前端中适当的user_id一起使用(更改所需的模板)
  3. 像往常一样,为该端点编写一个基于类或基于函数的视图,检查user_id参数,检查请求中的身份验证,将请求中的用户与用户实例中的用户进行比较,或者做一些其他事情
  4. 当您有未经授权的请求时,用401 Not Authorized响应
  5. 使用FileResponse的响应处于OK状态
from django.http import FileResponse
response = FileResponse(open('myfile.png', 'rb'))

使用user.profile_image属性

理论上,如果用户不知道/media/testuploads/filename.ext的旧路径,则此文件为“未共享

但是如果您想确定-不要使用NGINX提供/media/文件夹,或者如果您想提供另一个媒体文件(return 401 https://$host$request_uri;在需要的块中的NGINX配置中)。此类更改需要重新加载NGINX

观看下一季的视图缓存😀 以提高性能。但如果在默认设置下工作,浏览器将缓存图像

相关问题 更多 >

    热门问题