我想删除我的域名下用户的所有cookie。我知道logout()方法会删除会话,但似乎我的一些应用程序正在生成更多需要清理的 cookie。我怎样才能实现这个目标?
我有一个用户登录.如何延长/更新从请求收到的会话的到期日期?提前致谢!
我有一个搜索视图,它在会话中保存一些数据以供另一个视图使用:
def search(request):
    ...
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            melk=data(cd)
            request.session['data'] = melk
            request.session['form'] = form
            return redirect('/result/')
    ...
def result(request):
    ...
    melk_list = request.session['data']
    form = request.session['form']
    ...
当我使用 Chrome 时,一切都很好。但是当我使用 Firefox 时,第一次运行得很好,但之后每次搜索都会返回我的第一个结果!request.session第一次之后似乎没有改变。我尝试使用 删除会话del request.session['data'],但没有成功。
我的会话后端是一个数据库,但 Firefox 制作了一个会话 cookie。
我想将登录用户限制在一个会话中 - 甚至在浏览器选项卡周围。如果用户在另一个选项卡中加载页面将不会登录,登录时 - 所有其他会话将被破坏。
怎么做?
我的网站提供几乎静态的页面,并且没有用户登录等。
出于性能原因,我想完全禁用会话(因此 django 不会访问数据库以获取每个请求的会话)。
我django.contrib.sessions从 INSTALLED_APPS 中删除了,还有什么我需要做的吗?
这是我当前的sessionIdcookie 属性:
设置-Cookie:sessionid=3jdpjxgepk49vrnhbabdvju3r80ci581;到期=格林威治标准时间 2018 年 8 月 6 日星期一 12:40:14;HttpOnly; 最大年龄=1209600;路径=/
我想sessionId通过以下secure属性确保安全:
设置-Cookie:sessionid=3jdpjxgepk49vrnhbabdvju3r80ci581;到期=格林威治标准时间 2018 年 8 月 6 日星期一 12:40:14;HttpOnly,安全;最大年龄=1209600;路径=/
我尝试在 中添加以下属性settings.py:
SESSION_COOKIE_SECURE = True
但是,我仍然没有secure在sessionId. 对此有任何替代解决方案吗?
我正在开发具有多个数据库的 Django 项目。在应用程序中,我需要根据用户的请求将数据库连接从 Development-Database 切换到 Test-DB 或 Production-DB。(数据库架构已设置且不可更改!)
我也在这里用这个旧指南试了运气 不起作用。在数据库路由器中,我无法访问 threading.locals。
我也尝试过设置自定义数据库路由器。通过会话变量,我尝试设置连接字符串。要读取 dbRouter 中的用户会话,我需要确切的会话密钥,否则我必须循环抛出所有会话。
object.using('DB_CONNECTION) 的方式是不可接受的解决方案......对于许多依赖项。我想为登录用户全局设置连接,而不为每个模型功能提供数据库连接......
请给我一些如何解决这个问题的意见。
我应该能够根据会话值在数据库路由器中返回 dbConnection...
def db_for_read|write|*():
   from django.contrib.sessions.backends.db import SessionStore
   session = SessionStore(session_key='WhyINeedHereAKey_SessionKeyCouldBeUserId')
   return session['app.dbConnection']
更新 1: 感谢 @victorT 的贡献。我只是用给定的例子尝试过。还是没有达到目标……
这是我尝试过的。可能你会看到一个配置错误。
Django Version:     2.1.4
Python Version:     3.6.3
Exception Value:    (1146, "Table 'app.myModel' doesn't exist")
.app/views/myView.py
from ..models import myModel
from ..thread_local import thread_local
class myView:
    @thread_local(DB_FOR_READ_OVERRIDE='MY_DATABASE')
    def get_queryset(self, *args, **kwargs):
        return myModel.objects.get_queryset()
.app/myRouter.py
from .thread_local import get_thread_local
class myRouter:
    def db_for_read(self, model, **hints): …django django-middleware django-models django-database django-sessions
我有两个/多个域,foo.com并且bar.com都具有相同的后端,这意味着两个域都将即将到来的请求重定向到托管在其他地方的同一个  “Web 实例”。
如果用户登录foo.com,他/她还需要登录bar.com才能访问任何端点/URL,例如bar.com/some/url/end-point/。
的SESSION_COOKIE_DOMAIN,如果我的域有可能做一些常见的模式。不幸的是,我没有。
问题
如何跨多个域维护用户会话?
我正在为 API 构建一个 Django 服务器,该 API 依赖于 JWT(或基于令牌的 - https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication)为我们的用户进行身份验证。
我不需要出于任何目的进行基于会话的身份验证。它会在每个请求上创建不必要的查询,并且当我不想对用户进行身份验证时也会对用户进行身份验证(我希望浏览器仅在请求中包含 Authentication 标头时进行身份验证,否则保留 AnnonymousUser。这是因为它会产生问题在我的一些中间件中,我验证我是否正在与访客或经过身份验证的用户打交道)。
然而,当我尝试使用管理应用程序时,问题就出现了(我无法想象在不使用 django 管理页面的情况下构建这个应用程序)。当我从设置文件中删除与会话相关的中间件:( django.contrib.sessions.middleware.SessionMiddleware, django.contrib.auth.middleware.AuthenticationMiddleware and django.contrib.messages.middleware.MessageMiddleware) 时,在执行 runserver 时出现以下错误:
ERRORS:
?: (admin.E408) 'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MIDDLEWARE in order to use the admin application.
?: (admin.E409) 'django.contrib.messages.middleware.MessageMiddleware' must be in MIDDLEWARE in order to use the admin application.
?: (admin.E410) 'django.contrib.sessions.middleware.SessionMiddleware' must be in MIDDLEWARE in order to use the admin application.
有人可以想出一种解决方法,我可以在 Django 中禁用会话,同时还可以使用管理面板吗?我想到的一个解决方案是破解添加授权标头到每个管理页面请求,但是1)我不知道如何继续这个想法,2)(更重要的是),我无法在禁用会话中间件时执行运行服务器。
django django-sessions django-rest-framework django-rest-auth django-rest-framework-jwt
在我们的项目中,我们使用 djangoSessionMiddleware来处理用户会话,并且运行良好。这里唯一的问题是当PermissionDenied异常发生时,错误及其回溯将在控制台中打印出来!然而,正如预期的那样,通过引发该异常,403页面将显示给用户,但我认为这似乎不合理,因为这里的中间件正在处理异常!就像未找到异常一样,我希望控制台中不会出现错误。有什么不对的吗?!
这是中间件设置:
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django_otp.middleware.OTPMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'axes.middleware.AxesMiddleware',
]
这是打印的错误:
Forbidden (Permission denied): /the/not_allowed/page
Traceback (most recent call last):
  File "/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.8/contextlib.py", line 75, in inner
    return func(*args, **kwds)
  File "/our_project/base/decorators.py", line 88, in wrapper
    return view_func(request, *args, **kwargs)
  File …