Django的X-Frame-Options設置
事件起因
事件的起因是這樣的,我在使用Django服務的時候,想在一個已經存在某個按鈕的主頁面上,單擊這個按鈕彈出某個功能頁面,設置某些內容,然后再退回到主頁面。
我使用了某個插件,在彈出的頁面上顯示我請求的鏈接被服務器拒絕。
在使用瀏覽器調試的console頁面中有如下的提示信息:Refused to display '頁面url' in a frame because it set 'X-Frame-Options' to 'deny'.
那么就知道是是X-Frame-Options設置出了問題。
- 有關X-Frame-Options
2.1 什么是X-Frame-Options
X-Frame-Options HTTP 響應頭是用來給瀏覽器指示允許一個頁面可否在 , 或者
2.2 X-Frame-Options選項
X-Frame-Options 有三個值:
DENY :表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許
SAMEORIGIN :表示該頁面可以在相同域名頁面的 frame 中展示
ALLOW-FROM uri :表示該頁面可以在指定來源的 frame 中展示
換一句話說,如果設置為 DENY,不光在別人的網站 frame 嵌入時會無法加載,在同域名頁面中同樣會無法加載。
另一方面,如果設置為 SAMEORIGIN,那么頁面就可以在同域名頁面的 frame 中嵌套。
3.Django有關配置
3.1 Django默認的配置
首先,Django起禁止X-Frame-Options,使用默認設置了相關的配置。
在項目的setting.py頁面中能夠找到如下的設置:
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
上面的內容顯示,Django的項目中默認設置了XFrameOptionsMiddleware的中間件,這個設置將對於X-Frame-Options的配置設置成了DENY。
在Django 3.0中,X_FRAME_OPTIONS的默認設置從SAMEORIGIN 變成了DENY。
3.2 Django總體配置
想要總體設置項目的X-Frame-Options可以使用如下的代碼:
X_FRAME_OPTIONS = 'SAMEORIGIN'
1
可以看出上面的是將X_FRAME_OPTIONS設置成SAMEORIGIN,但是這個改變了整個項目的設置,往往只有某些頁面才需要這樣的設置,因此下面介紹在單獨的頁面上設置這些內容。
3.3 指定的網頁配置
直接看代碼:
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
@xframe_options_exempt
def view_one(request):
return HttpResponse("This page is safe to load in a frame on any site.")
@xframe_options_deny
def view_two(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_three(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")
從上面的相應和名稱能夠很容易看出分別的含義,不在更詳細描述。
裝載來源:https://blog.csdn.net/u010403700/article/details/82112917