2016-06-09 83 views
0

我有问题,我的过滤物通路Django的对象过滤器基于文件的URL

我想进行简单的系统,让员工只下载文件,从特定文件夹(媒体/客户/文件)。

我写了正则表达式的url和每个请求去file_get_url视图,我检查这个文件是否存在于文件模型基于URL过滤 - 但我不知道如何过滤这个。当我得到的对象,我有“file.url”,但不是在过滤器(file_url)。你有没有想过如何解决这个问题?

Urls.py:

urlpatterns = [ 
    url(r'^media/client/files/', 'file.views.file_get_url', name='file_get_url'), 
] 

Views.py:

@user_passes_test(lambda u: u.is_staff, login_url='/account/login/') 
def file_get_url(request): 
    if request.user.is_staff: 
     f = File.objects.filter(file_url=request.get_full_path()) 
     return HttpResponse(f.file.url) 

Models.py

class File(models.Model): 
    created_date = models.DateTimeField(auto_now_add=True) 
    user = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True) 
    file = models.FileField(upload_to='client/files/') 
    type = models.CharField(max_length=32, default=None, blank=True, null=True) 
    object_id = models.IntegerField(blank=True, null=False, default=None) 
    content_id = models.IntegerField(default=None, null=False, blank=False) 
+0

你并没有什么,因为FILE_URL不 –

+0

而且,在你的模型中已经提到文件应该被上传到文件模型场“/客户端/文件”,你希望员工用户只能从那里下载它。所以有什么问题?原谅我,但我在这里并没有真正看到问题 –

回答

0

我解决我的问题全光照g两个根据路径直接查看文件,另一个根据file_id查看文件。也许有人会有所帮助:)

@user_passes_test(lambda u: u.is_staff, login_url='/account/login/') 
    def file_get_url(request): 
     file_path = request.get_full_path()[1:] # to remove '/' 
     if os.path.isfile(file_path): # to check if this file(based on path) exist there! 
      response = HttpResponse(FixedFileWrapper(open(file_path, 'rb')), content_type=mimetypes.guess_type(file_path)[0]) 
      response['Content-Length'] = os.path.getsize(file_path) 
      response['Content-Disposition'] = "attachment; filename=%s" % os.path.basename(file_path) 
      return response 
     else: 
      return HttpResponse('Nothing exist here!') 

@user_passes_test(lambda u: u.is_staff, login_url='/account/login/') 
def file_get(request, file_id): 
    f = File.objects.get(id=file_id) 
    file_path = f.file.url[1:] 

    response = HttpResponse(FixedFileWrapper(open(file_path, 'rb')), content_type=f.type) 
    response['Content-Length'] = os.path.getsize(file_path) 
    response['Content-Disposition'] = "attachment; filename=%s" % os.path.basename(file_path) 
    return response