【发布时间】:2015-03-16 11:07:15
【问题描述】:
我想知道是否有一种方法可以保护未经身份验证时隐藏的图像或文件。
假设我的网站中有一张图片,只有在该用户经过身份验证后才能看到。但问题是我可以复制网址或在新选项卡中打开图像。
http://siteis.com/media/uploaded_files/1421499811_82_Chrysanthemum.jpg
同样,即使我没有通过身份验证,我也可以通过访问该 url 来查看该特定图像。所以,我的问题是,如何保护文件,以便只有经过身份验证的用户才能看到?
更新:
查看:
def pictures(request, user_id):
user = User.objects.get(id=user_id)
all = user.photo_set.all()
return render(request, 'pictures.html',{
'pictures': all
})
型号:
def get_upload_file_name(instance, filename):
return "uploaded_files/%s_%s" %(str(time()).replace('.','_'), filename)
class Photo(models.Model):
photo_privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
user = models.ForeignKey(User)
image = models.ImageField(upload_to=get_upload_file_name)
设置:
if DEBUG:
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "static-only")
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "media")
STATICFILES_DIRS = (
os.path.join(os.path.dirname(BASE_DIR), "myproject", "static", "static"),
)
更新:
模板:
{% if pictures %}
{% for photo in pictures %}
<img src="/media/{{ photo.image }}" width="300" alt="{{ photo.caption }}"/>
{% endfor %}
{% else %}
<p>You have no picture</p>
{% endif %}
网址:
url(r'^(?P<user_name>[\w@%.]+)/photos/$', 'pictures.views.photos', name='photos'),
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
【问题讨论】:
-
一种方法是让控制器处理 URL
/media/uploaded_files/*并检查凭据。如果未授权,则返回 404 状态。 -
@Javier 请你看一下更新,并建议我如何去做。谢谢。
-
文件的 URL 现在应该是一个逻辑 URL,而不是静态的一部分。然后我会做一些类似于@Burhan Khalid 发布的事情。
-
@Javier 我怎样才能使它合乎逻辑?在 settings.py?你能回答它而不是评论。我对 Django 很陌生。如果可以的话,我将不胜感激。
标签: python django url authentication file-access