2016-05-24 13 views
2

私はDjangoテンプレートビューにデコレータ@xframe_options_exemptを追加しようとしていますが、それはxframe_options_exemptジャンゴTemplateView

例外値でcomplais:「辞書」オブジェクトは、

「xframe_options_exempt」は属性 を持っていません

私はDjango 1.9文書に気付きました。デコレータはリクエストパラメータを持つビューに使用されており、私は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 

基本的に私は他の誰がこの問題を持っている場合さて、このデコレータはget_context_data方法に適用することはできませんが、あなたからgetメソッドをオーバーライドすることができIFRAME

答えて

4

あなたがdecorating class based viewsある場合、あなたは私たちをすべきを行いますe method_decoratorrequestを引数とするメソッドをオーバーライドする必要があります。 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からコードを複製する必要はありません。

ジャンゴ1.9は、あなたが好む場合は、クラスを飾ることができます:

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

ニース、私はそれを – lapinkoira

+1

を行うためのクリーンな方法があります知っていたので、私は上記の両方のバージョンを試してみましたが、それらのどれも私のために働いていません。それは「Xフレームオプション」を「SAMEORIGIN」に設定しているため、フレームに*を表示することを拒否しています。どんな考え? –

+0

ここにコメントするのではなく、新しい質問をする方がよいでしょう。私はclickjacking保護機能に精通していないので、私は助けることはできません。 – Alasdair

0

にDjangoのテンプレートビューを埋め込む必要があります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 

そして、これはトリック