10 апр. 2014 г.

Поддержка CORS в django-rest-framework

Во время реализации RESTful API для нашей админки я столкнулся с интересной особенностью.
Как оказалось, браузер перед отправкой PUT (а также POST и DELETE) запроса к ресурсу отправляет запрос OPTIONS, ожидая, что в заголовке ответа сервера Access-Control-Allow-Methods будут указаны допустимые методы доступа к данному ресурсу. Но django-rest-framework указывает допустимые методы в заголовке Allow, который описывает методы, которые вообще можно вызывать для данного ресурса, этот заголовок не воспринимается браузерами.
Поэтому, для поддержки CORS в RESTful API необходимо написать небольшой middleware, который будет писать необходимые заголовки.
Например, это можно сделать так:
class CORSMiddleware(object):
    def process_response(self, request, response):      
        """
        Этот метод выполняется после формирования ответа клиента перед его выдачей.
        Здесь формируются заголовки ответа для поддержки CORS
        """
       
        """
        Если запросили OPTIONS, то надо скопировать допустимые методы из
        Allow в Access-Control-Allow-Methods
        """
        if request.method.upper()=='OPTIONS':          
            response["Access-Control-Allow-Methods"]=response["Allow"]
       
        #Проверяем, есть ли запрашивающий домен в списке доверенных и добавляем его в Access-Control-Allow-Origin
        if request.META.get("HTTP_ORIGIN","") in settings.ALLOW_ORIGIN:
            response["Access-Control-Allow-Origin"] = request.META.get("HTTP_ORIGIN","")
           
        #Можно пересылать куки с другого домена (дыра - лучше не используйте)
        response["Access-Control-Allow-Credentials"] = "true"      
                   
        return response


Как видно из кода, middleware просто копирует содержимое заголовка Allow в заголовок Access-Control-Allow-Methods.
Домен, который произвёл запрос сверяется со списком допустимых и записывается в Access-Control-Allow-Origin. Так нужно делать, чтобы не светить весь список допустимых доменов, а представлять потребителю только сам факт допустимости запросов с его домена.
Access-Control-Allow-Credentials позволяет браузеру пересылать куки кросс-доменно. Это потенциальное решето, но нам необходимо поддерживать legacy-авторизацию на куках CodeIgniter'а, так что пока оставили.

Всем добра и джанги.

10 февр. 2014 г.

Новая система регистрации ТС

Вчера я познал, что такая структура как ГИБДД может работать быстро и не создавая лишних проблем.
Как оказалось, теперь можно внести изменения в регистрационные данные ТС без замены номеров, т.е. перевыпустить свидетельство о регистрации и внести изменения в ПТС, сохранив номера, которые оставил на машине предыдущий владелец.
Для этого надо с утра пораньше (7:45 - идеально) в любой день (даже в воскресенье) подъехать к отделению МОГТОРЭР №3 ГИБДД ГУ г. Москвы по адресу Сигнальный проезд, д.9, взять талончик в автомате и следовать написанным на нём инструкциям.
Предварительно стоит оплатить госпошлину в размере 500р. (я сделал это в банкомате сбера). С собой нужно иметь экземпляр договора купли-продажи, копию ПТС (две стороны), оригинал ПТС, свидетельство о регистрации ТС, гражданский паспорт и страховой полис ОСАГО.
У меня вся процедура заняла полтора часа. Никакие заявления заполнять не надо, просто берёшь талон, ждёшь, подаёшь в свою очередь документы в окошко, получаешь заполненное заявление, катишься на площадку, в свою очередь предъявляешь авто к осмотру, возвращаешься с документами в другое окошко, отдаёшь их, через 15 минут получаешь ПТС и свидетельство о регистрации.
Короче, лучей любви тем, кто разработал эту систему, а также сотрудникам отделения на Сигнальном, которые посылают всяких хитрожопых дедов, прущихся вне очереди.