2017-01-18 19 views
0

我想改變Django的sessioid標記的長度,所以不是32個字符,它會是瘋狂的東西,比如64個字符。我知道這很多,但可以做到嗎?有沒有理由不這樣做?我可以更改Django的sessionid令牌長度嗎?

我知道密鑰的長度在django.contrib.sessions.backends類SessionBase定義,但我似乎無法找到指示如何重寫後端功能或更換。

Ps。我是網絡開發的新手,所以我發現很難理解一些文檔。使用C++,它非常容易...

+0

你能解釋一下你爲什麼要這樣做嗎? –

+0

當然。簡短的回答是因爲我的「主管」或給我任務的人要這樣做。即使我不認爲這是必要的,但我真的需要一個不做這件事的好理由,因爲懶惰或缺乏技巧,所以它看起來不像是抵抗。我在網絡安全方面工作時並沒有真正的經驗權威,而我也是網絡開發新手。據我所知,我正在製作其他程序將使用的API,並且我被要求使用Django的會話來完成它,儘管通常會話驗證用於瀏覽器和AJAX。 – osirola

回答

1

Django中的子類化與C++中的子類化相同;你只需要定義一個從基類繼承的新類並覆蓋相關的方法。

在你的情況下,會話密鑰在_get_new_session_key方法中定義。您需要從您已經使用的任何會話後端(例如數據庫,文件或緩存後端)繼承,並定義該方法。例如:

from django.contrib.sessions.backends.db import SessionStore as OriginalSessionStore 

class SessionStore(OriginalSessionStore): 
    def _get_new_session_key(self): 
     "Returns session key that isn't being used." 
     while True: 
      session_key = get_random_string(64, VALID_KEY_CHARS) 
      if not self.exists(session_key): 
       break 
     return session_key 

現在你可以在你的SESSION_ENGINE設置使用"path.to.module.with.overridden.class"

+0

感謝您的回答。好的,所以我在** settings.py **中有「SESSION_ENGINE ='my_api.customsessionstore'」,並且我在** customsessionstore.py **中有新類。我只是想知道我現在需要做什麼才能使它工作。現在當用戶登錄時,仍然會創建一個32長的sessionid。我是否需要在登錄後自己調用某個函數,如request.session.set_session_key(),還是應該實際替換重寫的類? – osirola

+0

我的錯誤,看起來像Django期望該類被稱爲SessionStore,所以它仍然拿起你導入的默認。我已經更新了代碼,現在就試試。 –

+0

謝謝,我現在開始工作了!我接受了你的回答。不知道是否對我來說有些徒勞,因爲我剛剛注意到Django的session_key字段長度限制爲40,並且Django不支持子類覆蓋父類的字段......但至少有40個字符是超過32,我學到了東西:) – osirola

相關問題