python – 保护用户上传的文件django
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 保护用户上传的文件django,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2221字,纯文字阅读大概需要4分钟。
内容图文
![python – 保护用户上传的文件django](/upload/InfoBanner/zyjiaocheng/721/9a81869b4fb942129259e48558180d2d.jpg)
如何允许用户将文件上传到他们自己的用户指定文件夹,只看到他们上传的文件?我正在使用django文件传输.目前,它让我可以选择将媒体放入哪个文件,但我可以将其放在任何用户的文件中并查看每个用户的媒体.这是我的上传/ models.py:
from django.db import models
from django.contrib.auth.models import User, UserManager
def uploadmodel_file_upload_to(instance, filename):
print 'instance.user.username = '+ str(instance.user.username)
return 'uploads/%s/%s' % (instance.user.username, filename)
class UploadModel(models.Model):
user = models.ForeignKey('auth.user')
file = models.FileField(upload_to=uploadmodel_file_upload_to)
解决方法:
uploadmodel_file_upload_to返回相对路径.要构建完整路径,django会预先设置.MEDIA_ROOT. MEDIA_ROOT应该是公共可读的.
所以我们要将文件保存在MEDIA_ROOT之外.将这样的内容添加到settings.py:
import os.path
PROJECT_ROOT=os.path.abspath(os.path.dirname(__file__))
PROTECTED_MEDIA_ROOT=os.path.join(PROJECT_ROOT, 'protected_uploads')
现在您可以更新uploadmodel_file_upload_to以返回绝对路径:
def uploadmodel_file_upload_to(instance, filename):
return '%s/%s/%s' % (settings.PROTECTED_MEDIA_ROOT, instance.user.username,
filename)
既然文件保存在/ project / path / protected_uploads中,我们需要添加一个视图来提供它,例如:
import os
import mimetypes
from django import shortcuts
from django import http
from django.conf import settings
from django.views.static import was_modified_since
from django.utils.http import http_date
from .models import *
def serve_upload(request, upload_id):
upload = shortcuts.get_object_or_404(UploadModel, pk=upload_id)
fullpath = upload.file.path
if request.user != upload.user:
return http.HttpResponseForbidden()
statobj = os.stat(fullpath)
mimetype, encoding = mimetypes.guess_type(fullpath)
mimetype = mimetype or 'application/octet-stream'
if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
statobj.st_mtime, statobj.st_size):
return http.HttpResponseNotModified(mimetype=mimetype)
response = http.HttpResponse(open(fullpath, 'rb').read(), mimetype=mimetype)
response["Last-Modified"] = http_date(statobj.st_mtime)
response["Content-Length"] = statobj.st_size
if encoding:
response["Content-Encoding"] = encoding
return response
还有一个网址:
url(r'serve_upload/(?P<upload_id>\d+)/$', 'serve_upload'),
内容总结
以上是互联网集市为您收集整理的python – 保护用户上传的文件django全部内容,希望文章能够帮你解决python – 保护用户上传的文件django所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。