django - 如何在 django 中限制对媒体图像 URL 的访问

标签 django media-url

如何限制对媒体图像 url 的访问,并使其只能由 django 中的访问所有者用户访问,
这是我的类(class)模型:

class private_image(models.Model):
    i_user = models.OneToOneField(User, related_name='related_PRF_user', on_delete=models.CASCADE)
    i_image= models.ImageField(upload_to='images', blank=True, null=True )
我的媒体设置是:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root/')
MEDIA_URL = '/media_url/'
例如:如果请求用户不是同一所有者用户,我不希望用户在他们的浏览器中放置像“http://127.0.0.1:8000/media_url/images/67155_0_AVemgEZ.jpg”这样的图像网址并打开图像.
我相信,我可以做一个小函数来检查访问用户和请求的 URL '/media_url/images/' 以获取图像名称,然后使用图像名称从数据库中获取一个对象和
然后检查 owner(i_user) 如果相同的 access-user 。
但是我怎么能告诉 Django 在服务 MEDIA_URL 请求之前使用这个函数。
如果你有一个例子,那将非常有帮助。
先感谢您

最佳答案

全部 requests媒体应该经过一个特定的 View 。
myproject/urls.py :

from myproject.views import media_access

urlpatterns = [
    ...,
    path('media_url/images/<str:path>', media_access, name='media'),
    # or
    # url(r'^media_url/(?P<path>.*)', media_access, name='media'),
]
添加 View 并检查访问权限。
myproject/views.py :
from django.http.response import FileResponse
from django.http import HttpResponseForbidden

def media_access(request, path):    
    access_granted = False

    user = request.user
    if user.is_authenticated():
        if user.is_staff:
            # If admin, everything is granted
            access_granted = True
        else:
            # For simple user, only their documents can be accessed
            doc = user.related_PRF_user.i_image  #Customize this...

            path = f"images/{path}"
            if path == doc:
                access_granted = True

    if access_granted:
        response = FileResponse(user.related_PRF_user.i_image)
        return response
    else:
        return HttpResponseForbidden('Not authorized to access this media.')
请告诉我这是否有效..

关于django - 如何在 django 中限制对媒体图像 URL 的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67269445/

相关文章:

python - 找不到从 PIP virtualenv 安装 gettext 的方法

django - 自动生成的photologue图片网址是否可以覆盖?

python - 在 Django Admin 中可视化上传的图像

Python Django 媒体 url 在设置 DEBUG = True 后不起作用

Django-pipeline 'compressed' 不是有效的标签库 : ImportError raised loading pipeline. templatetags.compressed:没有名为 conf 的模块

django - 如何实现安全页面

python - Django LDAP 身份验证失败 : SERVER_DOWN

python - Django:访问模板中的列表属性