Я пишу приложение для форума на Django, используя пользовательскую систему session/auth/users/acl. Одна из целей — позволить пользователям просматривать и использовать мое приложение, даже если у них отключены файлы cookie. Исходя из мира PHP, лучшим решением проблемы является добавление sid= к каждой ссылке на странице. Вот как я планирую это сделать:
ПО промежуточного слоя сеанса проверяет, есть ли у пользователя файл cookie сеанса или файл cookie «запомнить меня». Если он это делает, это, скорее всего, означает, что файлы cookie работают на него. Если он этого не делает, мы генерируем новый идентификатор сеанса, открываем новый сеанс (делаем новую запись в таблице сеансов в БД), затем отправляем cookie и перенаправляем пользователя туда, где он находится, но с добавлением SID к URL-адресу. После перенаправления промежуточное ПО увидит, можно ли получить идентификатор сеанса из файла cookie или GET. Если это файл cookie, мы прекращаем добавлять sid к URL-адресам. Если это ПОЛУЧАЕТСЯ, мы их оставляем.
Я планирую вставить часть SID= в URL, украсив django.core.urlresolvers.reverse и reverse_lazy моей собственной функцией, которая добавляет к ним ?sid=. Однако это вызывает некоторые проблемы, потому что оба промежуточных программного обеспечения urlresolvers и не являются потокобезопасными. Чтобы преодолеть это, я создал что-то вроде этого:
class SessionMiddleware(object):
using_decorator = False
original_reverse = None
def process_request(self, request):
self.using_decorator = True
self.original_reverse = urlresolvers.reverse
urlresolvers.reverse = session_url_decorator(urlresolvers.reverse, 's87add8ash7d6asdgas7dasdfsadas')
def process_response(self, request, response):
# Turn off decorator if we are using it
if self.using_decorator:
urlresolvers.reverse = self.original_reverse
self.using_decorator = False
return response
Если SID нужно передавать по ссылкам, process_request устанавливает для using_decorator значение true и сохраняет необработанные urlresolvers.revers в отдельном методе. После рендеринга страницы process_response проверяет с помощью_decorator необходимость выполнения «сборки мусора». Если это так, он возвращает обратную функцию в исходное неукрашенное состояние.
Мой вопрос в том, является ли этот подход потокобезопасным? Или увеличение трафика на моем форуме может привести к тому, что промежуточное программное обеспечение снова и снова будет украшать эти функции, не выполняя «сборку мусора»? Я также думал об использовании регулярных выражений для простого просмотра сгенерированного HTML-ответа для ссылок и предоставления шаблонных фильтров и переменных для ручного добавления SID в места, которые опущены регулярным выражением.
Какой подход лучше? Также является ли текущий поток безопасным?