我有一份"文件" model,使用dropzone.js和register / login的上传系统。我现在迷失了如何将权限应用于每个上传的文件,因此只有指定的用户才能访问它们。
基本上: File1-> accessible_by = user1,user2
File2-> accesible_by =用户3,... USER5
等等。
感谢任何人就我的问题提供建议/帮助。
class DocumentCreate(CreateView):
model = Document
fields = ['file', 'is_public']
def form_valid(self, form):
self.object = form.save()
data = {'status': 'success'}
response = JSONResponse(data, mimetype =
response_mimetype(self.request))
return response
我在视图上做了以上处理dropzone.js文件上传。
class Document(models.Model):
file = models.FileField(upload_to = 'files/')
#validators=[validate_file_type])
uploaded_at = models.DateTimeField(auto_now_add = True)
extension = models.CharField(max_length = 30, blank = True)
thumbnail = models.ImageField(blank = True, null = True)
is_public = models.BooleanField(default = False)
uploaded_by = models.ForeignKey(User,
related_name='uploadedByAsUser', null=True)
allowed_users = models.ManyToManyField(User,
related_name='allowedUsersAsUser')
def clean(self):
self.file.seek(0)
self.extension = self.file.name.split('/')[-1].split('.')[-1]
if self.extension == 'xlsx' or self.extension == 'xls':
self.thumbnail = 'xlsx.png'
elif self.extension == 'pptx' or self.extension == 'ppt':
self.thumbnail = 'pptx.png'
elif self.extension == 'docx' or self.extension == 'doc':
self.thumbnail = 'docx.png'
def delete(self, *args, **kwargs):
#delete file from /media/files
self.file.delete(save = False)
#call parent delete method.
super().delete(*args, **kwargs)
#Redirect to file list page.
def get_absolute_url(self):
return reverse('dashby-files:files')
def __str__(self):
return self.file.name.split('/')[-1]
class Meta():
ordering = ['-uploaded_at']
答案 0 :(得分:0)
您可以在文档模型中添加Export-Csv
字段,以便只有指定的用户才能访问这些文件。例如:
#TYPE System.Management.Automation.PSCustomObject
这样,如果您希望将用户添加到"允许"列表,您可以使用以下内容添加它们:
allowed_user
然后让管理员看起来很好(admin.py):
class Document(models.Model):
file = FileField()
uploaded_by = models.ForeignKey(User, related_name='uploadedByAsUser')
allowed_users = models.ManyToManyField(User, related_name='allowedUsersAsUser')
然后,如果您想检查是否允许,您可以执行以下操作:
class DocumentCreate(CreateView):
model = Document
fields = ['file', 'is_public']
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.allowed_users.add(request.user)
self.object.save()
data = {'status': 'success'}
response = JSONResponse(data, mimetype =
response_mimetype(self.request))
return response
答案 1 :(得分:0)
您可以在HttpResponse上设置content_type。因此,您可以在视图中进行权限处理,并直接从Django提供文件:
return HttpResponse("Text only, please.", content_type="text/plain")
注意:Django不是一个Web服务器。建议使用Web服务器来提供静态文件!
如果您处理少量数据并且仅偶然提供数据,则上述方法可能是一种很好的方法。如果您需要强大的解决方案,则需要检查Django中的权限并将数据服务留给Web服务器。
查看Django文件流包:https://djangopackages.org/grids/g/file-streaming/