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

s6fujrry  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(124)

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

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/'

例如:我不希望用户把这样的图像URL“http://127.0.0.1:8000/media_url/images/67155_0_AVemgEZ.jpg“在他们的浏览器和打开图像,如果请求用户不相同的所有者用户.
我相信,我可以做一个小函数来检查访问用户和请求的URL '/media_url/images/'来获取图像名称,然后使用图像名称从数据库中获取对象,然后检查所有者(i_user)是否相同访问用户。
但是我如何告诉Django在请求MEDIA_URL之前使用这个函数呢?
如果你有一个例子,那将是非常有帮助。
先谢谢你了

6ie5vjzr

6ie5vjzr1#

media的所有requests都应通过特定视图。
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'),
]

添加视图并检查访问权限。

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.')

请告诉我这是否有效。

相关问题