2010-07-20 22 views
24

在我的django應用程序中我將數據庫中的字符串存儲在數據庫中,然後將在用戶的主頁上顯示爲「消息」。其中一些消息包含表單,但沒有用模板語言編寫,我無法插入csrf標記(從而打破了應用程序)。如何將django csrf令牌直接嵌入到HTML中?

有沒有辦法直接從我正在編輯的python文件中插入這個令牌?我正在尋找的東西沿線︰

csrf_token = django.csrf.generate() 
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token) 

任何其他解決方案,將在類似的情況下工作會很好。 感謝

編輯: 其實這不會工作,因爲令牌是每個會話不同,因此將其存儲在數據庫中不是非常有用。有沒有辦法在視圖中動態加載標記?

+0

你說的「動態加載視圖中的令牌」是什麼意思? – 2010-07-20 15:25:43

+0

表單被存儲爲數據庫中的一個字符串,所以如果我將這個標記存儲在那裏,它會在新會話中加載時立即失效。 如果可以從視圖中加載一個新的令牌,那麼我可以在它正在渲染時攔截html,插入適當的令牌並顯示工作表單。這裏關鍵的是我沒有通過模板插入令牌。 這是否使它更清晰? – ergelo 2010-07-21 12:41:48

+0

難道你不能只使用csrf_protect裝飾器? – sureshvv 2016-11-24 18:30:38

回答

42

撥打django.middleware.csrf.get_token(request)獲取CSRF令牌。

+1

,這將解決它。感謝您指出! – ergelo 2010-07-21 19:23:30

+0

這是否通過將令牌放入隱藏的輸入工作?因爲我不斷收到相同的錯誤,將此令牌放入表單的最佳方法是什麼? – 2017-01-03 19:08:49

+0

好的解決方案是使用名稱「csrfmiddlewaretoken」而不是「csrf_token」 – 2017-01-03 20:12:56

17

使用它的方式,直接在模板中使用它。

the documentation,:

<form action="" method="post"> 
{% csrf_token %} 

是你所包含。

+0

謝謝。問題在於'消息'是在視圖中創建的,並且存儲在數據庫中而沒有通過視圖。 我會通過將表單按鈕轉換爲鏈接並通過視圖繞過csrf來解決問題。 – ergelo 2010-07-20 17:28:07

+8

問題在於您不使用django的模板 – 2014-05-19 16:45:15

+0

在安裝Django-CMS期間,我解決了這個問題!出於某種原因,它不會在我擁有的唯一模板中使用此令牌登錄。奇怪的。 – MadPhysicist 2017-05-04 21:16:44

10

接受的答案假定已經在請求對象中設置了令牌。

也許這樣的事情是更好:

from django.middleware import csrf 
def get_or_create_csrf_token(request): 
    token = request.META.get('CSRF_COOKIE', None) 
    if token is None: 
     token = csrf._get_new_csrf_key() 
     request.META['CSRF_COOKIE'] = token 
    request.META['CSRF_COOKIE_USED'] = True 
    return token 
+0

謝謝。這對我有用。 – wildcolor 2015-03-14 10:08:27

+0

您不應該使用內部API,事實上_get_new_csrf_key()在Django中不再存在。你應該使用get_token()。 – interDist 2017-02-26 17:36:51