2017-02-13 22 views
0

我將一個從PHP(Codeigniter)到Python的應用程序移植到Python(由Django支持)。我已經遷移了數據庫,現在正在使用Django模型。我使用Django的ImageField字段填充圖像數據庫,並且圖像位於MEDIA_ROOT下的正確文件夾中。在Django中從不同於ImageField.url屬性的路徑傳遞圖像

我在開發中,因此我使用Django的服務器來測試Web應用程序,並且可以通過image.url來提供圖像。

image.url從服務形象:

MEDIA_ROOT/folder/subfolder/numberImage_folder_subfolder.jpg

但我需要它從MEDIA_ROOT/numberImage_folder_subfolder.jpg送達。

在製作中,我知道我可以使用nginxXSendFile或類似的東西。 Django的服務器(runserver命令)非常易於使用,併爲我提供了目前所需的服務。 在開發過程中,如何從我需要的URL傳送圖像?最好使用Django的服務器...

任何幫助將非常感激。

回答

0

我不完全清楚你的URL是什麼以及它們如何映射到文件路徑(並且沒有要求澄清的聲望)。所以,如果我理解錯了,請糾正我。

但與此同時,爲了稍微改寫問題,我想你說的是你在MEDIA_ROOT/folder/subfolder/numberImage_folder_subfolder.jpg這些子文件夾中存儲了磁盤上的文件,但是當你真的想要服務的URL時,你不想在URL中的文件夾,所以該URL將有MEDIA_ROOT/numberImage_folder_subfolder.jpg?並且只與./manage.py runserver

在這些假設前提下,我們有兩個步驟:將我們想要的URL映射回文件路徑,然後確保我們正在生成我們想要的URL。


對於第一,通常urls.py將有這樣的事情,以服務發展的媒體文件:

from django.conf.urls.static import static 
if settings.DEBUG is True: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

它基本上將url(r'^media/(?P<path>.*)$', django.views.static.serve)到你的URLconf,其中serve通吃路徑低於settings.MEDIA_URL,並提供MEDIA_ROOT下的等效文件。

最簡單的方法是創建一個自定義函數,該函數在同一個django.conf.urls.static上建模,該函數在將路徑傳遞到django.views.static.serve之前取回路徑並添加文件夾。


對於第二,如果你想從ImageField.url產生的URL從底層文件的存放路徑不同,你需要有一個自定義ImageField的子類重寫FileField.url property(或自定義存儲類,做類似的事情)。

像這樣:

class CustomURLImageField(django.forms.fields.ImageField): 
    def _get_url(self): 
     """ 
     Override the standard FileField.url property to mangle the URL from 
      MEDIA_ROOT/folder/subfolder/numberImage.jpg 
     to 
      MEDIA_ROOT/numberImage_folder_subfolder.jpg 
     """ 
     self._require_file() 
     #return self.storage.url(self.name) 
     path_components = self.name.split('/') 
     folder = path_components[-3] 
     subfolder = path_components[-2] 
     numberImage, ext = os.path.splitext(path_components[-1]) 
     return '/{numberImage}_{folder}_{subfolder}{ext}'.format(**locals()) 
    url = property(_get_url) 

這將是在生產中可能是真的太...你是如何生成你的URL)

相關問題