Сервиране на медия чрез middleware

Публикувано на

Сервирането на статичните файлове за dev сървъра на Django не е предвидено по подразбиране. По принцип се дават решения от типа:

if settings.DEBUG:
    urlpatterns = urlpatterns + patterns('django.views.static',
        url(r'^media/(?P<path>.*)$', 'serve', {
'document_root': settings.MEDIA_ROOT,
'show_indexes':True}),
)

Но така се пускат всички middleware-и, което е излишно действие. На нас ни трябва само статичните файлове, коиото по принцип на production сървъра ще ги сервира nginx или apache. За целта можем да си направим простичък Middleware който да го сложим да се изпълнява първи, като проверява дали текущият път започва със settings.MEDIA_URL. Ако е така значи не е необходимо Django да се мъчи да резолва url от някой от описаните във urls.py понеже 100% е статичен файл. Тъй като ако самият Middleware върне HttpResponse, спира по-нататъшното изпълнение на другите middleware-и и се връща респонза, ние можем направо да върнем желания файл или 404, ако няма такъв. Ето и един пример който съм качил в Github Gist https://gist.github.com/1393050

blog comments powered by Disqus