Увеличьте количество символов, используемых Django SessionStore, с 32 до 64 - PullRequest
0 голосов
/ 17 декабря 2018

Django == 1.11.17, Python == 3.6.7

Я хотел бы расширить количество символов, используемых для ключа сеанса.

Lookingв django.contrib.sessions.backends.base.py:

class SessionBase(object):
    ...

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

Я хотел бы изменить 32 -> 64.

Я попробовал мартышкин-патчинг в одном из моих файлов:

import django.contrib.sessions.backends.base as sessions_base
import django.contrib.sessions.backends.file as sessions_file
from django.utils.crypto import get_random_string

def _get_new_session_key(self):
    while True:
        session_key = get_random_string(64, sessions_base.VALID_KEY_CHARS)
        print("SESSION KEY: {}".format(session_key))
        if not sessions_file.SessionStore.exists(self, session_key):
            break
    return session_key


sessions_file.SessionStore._get_new_session_key = _get_new_session_key

django.contrib.sessions.backends.file.py реализует SessionStore и exists().
Это решение просто игнорируется Django, и я не получаю показаний для печати, показывающих.

Просто к вашему сведению, это действительно печатаетидентификатор сеанса (с 64 символами), но с ошибками:
sessions_file.SessionStore._get_new_session_key = _get_new_session_key(sessions_file.SessionStore)

File "/Users/.../lib/python3.6/site-packages/django/contrib/sessions/backends/file.py", line 51, in _key_to_file
session_key = self._get_or_create_session_key()
AttributeError: 'str' object has no attribute '_get_or_create_session_key'

Вопросы:

  1. Это неРабота.Это связано с тем, что объект SessionStore создается из-за промежуточного программного обеспечения, до того как этот файл будет доступен?

  2. Должно ли мое решение быть промежуточным программным обеспечением?(Я бы предпочел monkey-patch)

ПРИМЕЧАНИЕ:

Также пробовал:
1. sessions_file.SessionStore.__dict__["_get_new_session_key"] = _get_new_session_key <- ошибка возникает <br>2. setattr (session_file.SessionStore, '_get_new_session_key', _get_new_session_key) `<- та же проблема, игнорируется </p>

1 Ответ

0 голосов
/ 17 декабря 2018

Мне удалось успешно переопределить длину ключа сеанса, используя этот код:

import django.contrib.sessions.backends.base as sessions_base
from django.contrib.sessions.backends.db import SessionStore as OriginalSessionStore
from django.utils.crypto import get_random_string

def _get_new_session_key(self):
    "Returns session key that isn't being used."
    while True:
        session_key = get_random_string(40, sessions_base.VALID_KEY_CHARS)
        print("*********** SESSION KEY: {}, {}".format(len(session_key), session_key))
        if not OriginalSessionStore.exists(self, session_key=session_key):
            break
    return session_key

OriginalSessionStore._get_new_session_key = _get_new_session_key

Что я обнаружил в процессе, так это то, что существует ограничение на длину ключа сеанса, 40 символов.
Если значение превышает 40 символов, это приведет к ошибке:

django.db.utils.DataError: value too long for type character varying(40)

Я буду продолжать искать способ изменить тип ключа сеанса, чтобы он содержал значение> 40 символов, поэтому любые указания будутДобро пожаловать.

Спасибо!

РЕДАКТИРОВАТЬ:

Я нашел модель AbstractBaseSession в Django.contrib.sessions.base_session.py:

@python_2_unicode_compatible
class AbstractBaseSession(models.Model):
    session_key = models.CharField(_('session key'), max_length=40, primary_key=True)

В настоящее время оценивает последствия переопределения, необходимой миграции и т. Д..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...