Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2015 15:23:05

iJustTry
Зарегистрирован: 2014-11-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Интересный редирект

Доброго времени суток всем!

В ходе просмотра курса от специалиста возник один вопросик по настройке FastCGI + Apache2, конкретней опишу ниже.
Есть приложение gallery.
urls.py в папке проекта (там где и settings.py) обрабывает url след. образом:

url(r'^images/', include('gallery.urls')),

(Пример!) При запросе картинки по адресу “192.168.0.2/images/1.jpeg” этот url обрабатывается через

from ../gallery/urls.py:

url(r'.*\.jpe?g$', 'gallery.views.no_picture'),

вот такой регуляркой. Суть её в обработке .jpg или .jpeg

Само представление имеет вид ( from ../gallery/views.py):

def no_picture(request):
    return HttpResponseRedirect(u"/images/notFound.gif")

Т.е. получается след картина: пользователь пытается запросить картинку “1.jpeg” по адресу “192.168.0.2/images/1.jpeg”:
- если картинка по адресу ../htdocs/images/ есть, ему возвращается статика (просто открывается картика в окне браузера)
- если такой картинки по адрему ../htdocs/images/ не находится, происходит редирект на “192.168.0.2/images/notFound.gif”, которая отображается как обычная картинка в окне браузера и располагается она в той же папке ../htdocs/images/.

Более подробно про описываемый эффект можно посмотреть тут << youtube

Буду благодарен за любую инфу, а ещё лучше если кто-нить тыкнет меня носом в рабочий мануал.

Может это можно не через FastCGI сделать, а скажем, через nginx + apache. Подобную систему я поднял у себя на виртуалке. Nginx передаёт все запросы апачу, а сам обрабатывает только статику. В случае если файл 1.jpeg не найден, он показывает свою (nginx'овскую 404), а хотелось бы редирект на заданную картинку.

P.s. гуглил - не нашёл. Первая часть, когда в данном курсе выполнялась настройка виртуалки, потеряна и в сети её нет. Поэтому решил обратиться к Вам. Спасибо

Отредактировано iJustTry (Фев. 23, 2015 16:06:53)

Офлайн

#2 Фев. 24, 2015 10:24:50

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Интересный редирект

тут смысл в том, что обрабатываются урлы в порядке их определения.

т.е. сначала у вас проверится на совпадение с существующей картинкой, а если ничего не совпало, то в конце попадет под правило для:

url(r'.*\.jpe?g$', 'gallery.views.no_picture'),

Офлайн

#3 Фев. 24, 2015 11:27:52

iJustTry
Зарегистрирован: 2014-11-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Интересный редирект

Там прикол в том, что если по данному урлу находит картинку - он её выдает из директории. Просто выплёвывает как статичный файл в браузер. Там даже до обработки урла в Django дело не доходит, веб-сервер сам выдает картинку. А вот если он её не находит у себя по директории, то отдаёт урл на обработку в Django, а Django в свою очередь попросту редиректит на существующую картинку notFound.gif, которую веб-сервер находит и выплёвывает в браузер.

запрос на статику -> есть статика -> отдаём статику
запрос на статику -> не нашли статику -> отдаём запрос Django -> Django выдает редирект на статику -> выдаём статику.

-> запрос: 192.168.0.2/gallery/images/1.jpeg -> файл найден по директории: ../htdocs/images/1.jpeg -> возвращается клиенту в браузере
-> запрос: 192.168.0.2/gallery/images/blah-blah.jpeg -> файл в директории: ../htdocs/images/ не существует -> отдаём запрос на Django -> Django смотрит в урлы:

url(r'.*\.jpe?g$', 'gallery.views.no_picture'),
-> вызывает “gallery.views.no_picture”
а там :
def no_picture(request):
    return HttpResponseRedirect(u"/images/notFound.gif")
-> Django выдаёт редирект на “192.168.0.2/gallery/images/notFound.gif”
-> веб-сервер (например: тот же nginx) получает запрос на 192.168.0.2/gallery/images/notFound.gif -> находит в директории ../htdocs/images/notFound.gif -> кидает её в браузер


Вот, собственно, как так настроить? Потому, что если в связке nginx + apache + wsgi, где nginx сидит на раздаче статики, и если он не находит файл по шаблону для статики, он не выполнит редирект, а вернёт “свою” 404.

(пример из конфига nginx)

location / {
                proxy_pass http://127.0.0.1:8080/; #Переадресация запросов к Apache
                proxy_set_header Host $http_host;  #Подкорректируем заголовки, чтобы отличать одного клиента от другого
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_connect_timeout 120;
                proxy_send_timeout 120;
                proxy_read_timeout 180;
        }
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt|exe|pdf|djvu|doc|docx|xls|xlsx)$ {
                root /var/www/my_project;
                access_log /var/www/my_project/log/nginx_static.log;
                expires max;

В файле ../gallery/urls.py всего один урл обрабатывается, а именно:

url(r'.*\.jpe?g$', 'gallery.views.no_picture'),

Больше там никаких урлов нет. Так что это не из-за порядка обработки урла. Это какой-то финт настройки веб-сервера, как мне кажется.

Спасибо, что откликнулись.
(извиняюсь за путаность)

Отредактировано iJustTry (Фев. 24, 2015 11:53:55)

Офлайн

#4 Фев. 24, 2015 12:08:27

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Интересный редирект

ну это правильное поведение.

Если файл не найден в местах размещения статики, то запрос передается в джангу, где дальше проверяется по шаблонам урлов и наличию обработчика для 404.

т.е. таким образом не получится сделать урл, совпадающий с существующим элементом статики.

Офлайн

#5 Фев. 24, 2015 12:44:30

iJustTry
Зарегистрирован: 2014-11-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Интересный редирект

Так вот у меня он (nginx) не передаёт в джангу (а точне: не проксирует на апач, в случае когда не находит файла), а показывай свой 404 и всё(

Отредактировано iJustTry (Фев. 24, 2015 13:25:56)

Офлайн

#6 Фев. 24, 2015 15:21:54

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Интересный редирект

попробуйте поиграться с этой настройкой:

http://wiki.nginx.org/HttpProxyModule#proxy_intercept_errors

Офлайн

#7 Фев. 24, 2015 17:45:34

iJustTry
Зарегистрирован: 2014-11-11
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Интересный редирект

Не канает((
Можно попросить линк на проверенный ман по которому можно настроить эту ересь (я про редирект и проксирование одного веб-сервера другим)? Я перепробовал кучу мануалов (половина из которых тупо уже не актуальна), а данный вид редиректа не даёт мне покоя.

Отредактировано iJustTry (Фев. 24, 2015 20:56:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version