我希望在与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)
让我们自己做吧
您可以使用检查身份验证的自定义视图提供您的个人资料图像
您可以实现所需的功能,而无需附加依赖项。作为奖励,您将了解整个过程
因此,您需要:
urls.py
中添加一个类似/profiles/<int:user_id>/image/
的路径user_id
一起使用(更改所需的模板)user_id
参数,检查请求中的身份验证,将请求中的用户与用户实例中的用户进行比较,或者做一些其他事情李>401 Not Authorized
响应李>使用
user.profile_image
属性理论上,如果用户不知道
/media/testuploads/filename.ext
的旧路径,则此文件为“未共享”但是如果您想确定-不要使用NGINX提供
/media/
文件夹,或者如果您想提供另一个媒体文件(return 401 https://$host$request_uri;
在需要的块中的NGINX配置中)。此类更改需要重新加载NGINX观看下一季的视图缓存😀 以提高性能。但如果在默认设置下工作,浏览器将缓存图像
相关问题 更多 >
编程相关推荐