Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django Rest框架作为文件系统处理的安全层_Python_Django_Rest - Fatal编程技术网

Python 使用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

我正试图保护我的远程服务器文件系统不受未经授权的用户的攻击。 我在另一台服务器上有一个远程存储,用于存储和处理来自各种进程的PDF和PNG

我将Python2.7与Django 1.8和Django Rest框架一起使用

我试图实现非常基本的“代理层”,它将让我控制谁使用过文件系统

这是我的
视图.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可序列化的
,那么最好还是回到普通的Django
HttpResponse
而不是DRF的
响应
。如果有帮助的话试试看,不幸的是,我现在没有一个操场来测试它。