LINUX.ORG.RU
Ответ на: комментарий от trashymichael

потом для хендлера можно перегрузить render, задавать сразу два шаблона, layout страницы и partial сущности, и обслуживать запросы браузер и аякс запросы одновременно

    def render(self, template, layout, **kwargs):
        if "X-Requested-With" in self.request.headers and \
                self.request.heaeders["X-Requested-With"] == "XMLHttpRequest":
            super(Resource, self).render(template, **kwargs)
        else:
            super(Resource, self).render(layout, **kwargs)

или лучше сделать отдельный метод, не нарушая апи

def resource(self, layout, partial=None, **kwargs):
        if "X-Requested-With" in self.request.headers and \
                self.request.heaeders["X-Requested-With"] == "XMLHttpRequest":
            if partial:
                self.render(partial, **kwargs)
            else:
                raise HTTPError(405)
        else:
            self.render(layout, **kwargs)
trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 2)
Ответ на: комментарий от trashymichael

Нужно использовать не X-Requested-With, а Accept (см. http content negotiation). Иначе будут случаи, когда у пользователя появится в браузере то, что ты отдал для XHR (т.е. json, например). Это получается из-за кеша (браузера, прокси), который не смотрит на X-Requested-With и не различает запросы.

anonymous
()
Ответ на: комментарий от anonymous

возможно, я только начал эту технику, есть мелкий проект в продакшене с такими хендлерами, знаю что в старых браузерах это может не сработать, но я типа делаю продукт и мне типа пое!«№ть на старье, надо двигать прогресс, лучше сделать лучше для современных чем хуже но со старыми, я так думаю

еще раз спасибо за наводку, буду разбираться

trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 1)
Ответ на: комментарий от trashymichael

вобщем, простые сущности из формы и модели обслуживаются круд-хелперами, это немного говнокод-наброски, но суть передаст


@coroutine
def create(model_class, form_class, handler, template):
    _form = form_class(handler)
    if _form.validate():
        model = yield Task(model_class(_form.data).save)
        handler.redirect(handler.permalink(model.pk))
    else:
        handler.resource(
            template,
            None,
            form=_form,
            new=True
        )


@coroutine
def update(model_class, form_class, handler, template):
    id_ = handler.get_argument('id')
    try:
        _id = ObjectId(id_)
    except InvalidId:
        raise HTTPError(400)
    else:
        _form = form_class(handler)
        if _form.validate():
            model = yield Task(
                model_class.find,
                {'_id': _id},
                [('id', -1)]
            )
            model.merge_with_form(_form)
            yield Task(model.save)
            handler.redirect(handler.permalink(model.pk))
        else:
            handler.render(
                template,
                form=_form,
                new=False
            )


@coroutine
def form(model_class, form_class, handler, template):
    id_ = handler.get_argument('id', None)
    if id_:
        try:
            _id = ObjectId(id_)
        except InvalidId:
            raise HTTPError(400)
        else:
            model = yield Task(
                model_class.find,
                {'_id': _id},
                [('_id', -1)]
            )
            _form = form_class(handler, model.to_primitive())
    else:
        _form = form_class(handler)
    handler.resource(
        template,
        None,
        new=not bool(id_),
        form=_form,
    )

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

class EditCategoryHandler(Handler):
    @coroutine
    def get(self):
        yield form(
            Category,
            CategoryForm,
            self,
            'category/layout/edit/category.jade'
        )

    @coroutine
    def put(self):
        yield create(
            Category,
            CategoryForm,
            self,
            'category/layout/edit/category.jade'
        )

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Ну не знаю, я бы не назвал Firefox 26 старым./sarcasm Сам-то потыкай поактивней вперёд-назад на такой странице, увидишь.

anonymous
()
Ответ на: комментарий от trashymichael

можно еще

beforeSend: function (request)
            {
                request.setRequestHeader("Partial", "HTML");
            },

добавлять заголовок в реквест жиквери

trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 1)
Ответ на: комментарий от trashymichael

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

trashymichael ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.