Я хочу отключить автоматическое создание сеанса в Django для определенных URL-адресов. У меня есть /api/ * и каждый клиент, который попадает, который получает новую сессию Django. Есть ли способ игнорировать определенные URL-адреса?
Отключить создание сеанса в Django
Ответ 1
Тривиальное решение заключается в том, чтобы ваш веб-сервер различал вызовы API и обычные вызовы, а затем два разных экземпляра WSGI вашего приложения: один с включенными сеансами, другой с отключенными сеансами. (Это, вероятно, намного проще с Nginx, чем с Apache.)
Альтернативой является наследование SessionMiddleware, а затем редактирование функций процесса, чтобы игнорировать все запросы, соответствующие вашим критериям. Что-то вроде:
from django.contrib.sessions.middleware import SessionMiddleware
class MySessionMiddleware(SessionMiddleware):
def process_request(self, request):
if request.path_info[0:5] == '/api/':
return
super(MySessionMiddleware, self).process_request(request)
def process_response(self, request, response):
if request.path_info[0:5] == '/api/':
return response
return super(MySessionMiddleware, self).process_response(request, response)
И затем отредактируйте файл настроек так, чтобы MIDDLEWARE_CLASSES содержал путь к "MySessionMiddleware", а не "django.contrib.sessions.middleware.SessionMiddleware".
Ответ 2
Я одобрил принятый ответ, но обратите внимание, что вы также можете использовать метод decorator_from_middleware для выборочного включения промежуточного программного обеспечения для каждого представления основа. Дополнительную информацию см. В ответах StackOverflow на Неглобальное промежуточное программное обеспечение в Django.
Ответ 3
В обычном промежуточном программном обеспечении или где-либо еще возможно также просто переопределить метод request.session.save
до того, как ответ будет обработан в SessionMiddleware, где вызывается метод.
request.session.save = lambda: None
Тривиальный, работает.
Преимущество этого подхода, хотя это де-факто взломать, заключается в том, что объект сеанса все еще доступен и может использоваться обычным способом без каких-либо дальнейших изменений кода.