2017-02-13 4 views
0

PHP(Codeigniter)からPython(Djangoを搭載)へWebアプリケーションを移植しています。すでにデータベースを移行していますが、今はDjangoモデルを使用しています。私はDjangoのImageFieldフィールドを使って画像をデータベースに取り込み、画像は適切なフォルダにMEDIA_ROOTの下にあります。ImageField.urlプロパティとは別のパスからDjangoの画像を配信します

開発中ですので、私は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のフォルダには、MEDIA_ROOT/numberImage_folder_subfolder.jpgが含まれていますか? ./manage.py runserverとのみですか?

これらの前提を前提にすると、2つの手順があります。必要なURLをファイルパスにマップし、必要なURLを生成していることを確認します。最初については


、通常urls.pyは開発中のメディアファイルを提供するために、このような何かを持っています:

基本的にserveは、すべてのパスを取り、あなたのURLconfへurl(r'^media/(?P<path>.*)$', django.views.static.serve)を追加して
from django.conf.urls.static import static 
if settings.DEBUG is True: 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

settings.MEDIA_URLの下にあり、MEDIA_ROOTに相当するファイルを提供します。

これを実行する最も簡単な方法は、同じdjango.conf.urls.staticでモデル化されたカスタム関数を作成して、パスを受け入れてからdjango.views.static.serveに渡すことです。二については


あなたはImageField.urlから生成されたURLは、基本的なファイル・ストレージ・パスは異なっしたい場合、あなたはFileField.url property(またはカスタムをオーバーライドするカスタムのImageFieldサブクラスを持っている必要があります同様のことをするストレージクラス)。

ようなので:

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) 

これは、あまりにも生産可能性がtrueになります...どのようにあなたのURLを生成している)