Django REST视图:返回没有模型的图像

时间:2017-05-31 09:07:53

标签: django django-views django-rest-framework

我是Django REST的新手,我一直在浪费时间用谷歌搜索一种方法来完成一些看似不太困难的事情。

我想使用Django预定义的视图类来定义视图。此视图应返回一个图像(给定其名称),因此这样的URL将返回图像Error in beta[i] <- rnorm(n, 0, 1) : object of type 'closure' is not subsettable

example.png

但是我不希望将此图像存储在模型中(它将作为png文件存储在服务器中)。类http://localhost:8000/api/v1/image/example.png 似乎符合我的需要,因为我可以设置权限和身份验证类来限制对图像的访问,但如果我没有模型,我无法弄清楚如何设置rest_framework.generics.RetrieveAPIView用我的照片。

有关于此的任何想法吗?谢谢并原谅我的无知。

3 个答案:

答案 0 :(得分:2)

如果我理解,您希望在允许访问图像之前检查权限。

我不认为Generic Views对你来说是个好途径,因为你没有绑定到db模型:

  

REST框架提供的通用视图使您可以快速完成   构建与您的数据库模型紧密相关的API视图。

根据Class Based Views的建议,更好的路径可以是Ivan Semochkin,例如:

class GetMyImage(APIView):
    authentication_classes = (...,)
    permission_classes = (...,)

    def get(self, request, format=None):
        with open('file path...') as fh:
            return HttpResponse(fh.read(), content_type='content/image')

当然不要忘记你的urls.py:

urlpatterns = [
    url(r'^image/example.png$', views.GetMyImage.as_view()),
]

答案 1 :(得分:0)

您可以使用HttpResponse返回简单的json数据。请在视图类中覆盖get方法。

import json

from django.http import HttpResponse

response_data = {}
response_data['image'] = 'http://localhost:8000/api/v1/image/example.png'

return HttpResponse(json.dumps(response_data), content_type="application/json")

答案 2 :(得分:0)

Django会将您指定根媒体文件夹的所有媒体文件存储起来。它还将从指定的根媒体网址提供服务。

在您的设置中添加;

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') 
MEDIA_URL = '/media/'

如果在您添加的根配置网址中,图像文件将在“http://localhost:8000/media/”处可用:

urlpatterns = [
    url(r'^api/v1/', include('api.urls', namespace='api')),
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

请记住导入配置设置和静态方法:

from django.conf import settings
from django.conf.urls.static import static