2017-05-31 24 views
0

我對Django REST來說是全新的,我一直在浪費時間搜索一些方法來完成一些看起來不太困難的事情。Django REST觀點:返回沒有模型的圖像

我想使用Django預定義的類來定義視圖。這種觀點應該返回一個圖像(給它的名字),所以像這樣的URL將返回圖像example.png

http://localhost:8000/api/v1/image/example.png 

不過,我不希望這樣的圖像將被存儲在一個模型(它會被存儲在服務器作爲png文件)。類rest_framework.generics.RetrieveAPIView似乎符合我的需求,因爲我可以設置權限和身份驗證類來限制對圖像的訪問,但我無法弄清楚如何設置queryset,如果我沒有模型與我的圖像。

對此的任何想法?謝謝你,原諒我的無知。

+0

了什麼DRF該怎麼做這一切呢?這聽起來像是你從服務器 – e4c5

+0

檢索一個圖像只是與nginx服務,爲什麼你需要爲此目的的Django的觀點? –

+0

我有使用DRF的其他視圖,我需要爲該視圖設置權​​限和身份驗證類(使用JWT)。我認爲DRF很好地做到了這一點。你會建議使用簡單的Django視圖嗎?在這種情況下是否可以限制對不擁有圖像的用戶的訪問? – GLR

回答

2

如果我理解的很好,您想在允許訪問圖像之前檢查權限。

我不認爲Generic Views是你的好路徑,你是不依賴於一個數據庫模型:

通過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()), 
] 
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") 
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 
相關問題