Python 使用Django Rest框架作为文件系统处理的安全层
我正试图保护我的远程服务器文件系统不受未经授权的用户的攻击。 我在另一台服务器上有一个远程存储,用于存储和处理来自各种进程的PDF和PNG 我将Python2.7与Django 1.8和Django Rest框架一起使用 我试图实现非常基本的“代理层”,它将让我控制谁使用过文件系统 这是我的Python 使用Django Rest框架作为文件系统处理的安全层,python,django,rest,Python,Django,Rest,我正试图保护我的远程服务器文件系统不受未经授权的用户的攻击。 我在另一台服务器上有一个远程存储,用于存储和处理来自各种进程的PDF和PNG 我将Python2.7与Django 1.8和Django Rest框架一起使用 我试图实现非常基本的“代理层”,它将让我控制谁使用过文件系统 这是我的视图.py: from django.conf import settings from rest_framework.views import APIView from rest_framework.re
视图.py
:
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import permissions
import requests
class Reports(APIView):
permission_classes = (permissions.AllowAny,) #Thats only for now...
def get(self, request, ssn, validity, file):
response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
return Response(response)
此概念适用于任何其他基于文本的响应请求(例如来自远程服务器的json响应)
我的问题是,当我调用此视图时,浏览器中会出现默认的REST方法定义页面
问题在于,您不能简单地将
请求
响应包装成DRF响应
并完成它。将代码更改为:
from django.core.servers.basehttp import FileWrapper
upstream_response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
response = Response(FileWrapper(upstream_response.content), content_type='YOUR_MIME_TYPE')
response['Content-Disposition'] = 'attachment; filename="%s"' % 'your_filename.ext'
return response
顺便说一句,还有其他(更干净,国际海事组织)的方法来解决这个特殊的任务。看看这个应用程序。它将实际的文件卸载到nginx或您选择的服务器上,同时允许您检查权限和内容。正如@AlexMorozov在评论中所说,您应该返回到
HttpResponse
。
你可以通过探索这个来了解
以下是我看到的代码:
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import permissions
from django.http import HttpResponse
import requests
import mimetypes
class Reports(APIView):
permission_classes = (permissions.AllowAny,)
def get(self, request, ssn, validity, file):
response = requests.get(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file)
mimetype = mimetypes.guess_type(settings.PROXY_BASE_URL + "/reports/" + ssn + "/" + validity + "/" + file) #Return an array
return HttpResponse(response, content_type=mimetype[0])
试试看。祝你好运:)Gal,你能给截图附加一个链接吗?我在编辑中附加了它,如果你在你的URL中附加
?format=json
,有什么变化吗?追加?format=json
以文本形式返回图像。我得到的不是json可序列化的
,那么最好还是回到普通的DjangoHttpResponse
而不是DRF的响应
。如果有帮助的话试试看,不幸的是,我现在没有一个操场来测试它。