2016-05-24 7 views
2

Я пытаюсь добавить декоратора @xframe_options_exempt в вид шаблона Джанго но complais сxframe_options_exempt для Django TemplateView

Exception Value: 'ДИКТ' объект не имеет атрибута 'xframe_options_exempt'

Я заметил, что в Django 1.9 docs декоратор используется для представлений с параметром запроса, и я использую TemplateView.

Возможно ли это использовать?

class MyView(TemplateView): 
    """ 
    """ 

    template_name = 'app/template.html' 

    from django.views.decorators.clickjacking import xframe_options_exempt 

    @xframe_options_exempt 
    def get_context_data(self, **kwargs): 

     context = {} 
     context['test'] = 'hello' 

     return context 

В основном нужно вставлять вид шаблона Джанго в IFRAME

ответ

4

Когда вы decorating class based views, вы должны нам e method_decorator. Вы должны переопределить метод, который принимает значение request в качестве аргумента, например. dispatch (будет применяться ко всем типам запросов) или get (будет применяться для получения запросов, но не для запросов на отправку). Как вы нашли, украшение get_context_data не будет работать.

class MyView(TemplateView): 

    @method_decorator(xframe_options_exempt): 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

Обратите внимание, что при использовании super() вы не должны дублировать код из TemplateView.

Django 1.9 позволяет украсить класс, если вы предпочитаете:

@method_decorator(xframe_options_exempt, name='dispatch') 
class ProtectedView(TemplateView): 
    template_name = 'secret.html' 
+0

Ницца, я знал, что есть более чистый способ сделать это – lapinkoira

+1

Так что я попробовал обе версии выше, но ни один из них не работает для меня. Он говорит: «Отказано в отображении * в кадре, потому что он установил« X-Frame-Options »в« SAMEORIGIN »». Любая идея почему? –

+0

Лучше спросить новый вопрос, а не комментировать здесь. Я не знаком с функциями защиты от щелчка, поэтому я не могу помочь. – Alasdair

0

Ну, если кто-то имеет эту проблему, этот декоратор не может быть применен к get_context_data метод, но вы можете переопределить метод получить от TemplateView, что-то вроде этого:

class MyView(TemplateView): 
    """ 
    """ 

    template_name = 'app/template.html' 

    from django.views.decorators.clickjacking import xframe_options_exempt 

    @xframe_options_exempt 
    def get(self, request, *args, **kwargs): 
     context = self.get_context_data(**kwargs) 
     return self.render_to_response(context) 

    def get_context_data(self, **kwargs): 

     context = {} 
     context['test'] = 'hello' 

    return context 

И это будет делать трюк

Смежные вопросы