如何在django中设置登录cookie?

问题描述 投票:0回答:4

如何用登录到我网站的会员的用户名设置cookie?

谢谢你

django cookies login member
4个回答
1
投票

你可以通过使用 会话中间件确保在你的项目中启用它。我建议你使用 django.contrib.auth 来管理会话。它在数据库中管理会话,这比仅仅将用户名保存在cookie中要安全得多。


8
投票

下面是一个如何使用中间件来实现的例子

class UserCookieMiddleWare(object):
    """
    Middleware to set user cookie
    If user is authenticated and there is no cookie, set the cookie,
    If the user is not authenticated and the cookie remains, delete it
    """

    def process_response(self, request, response):
        #if user and no cookie, set cookie
        if request.user.is_authenticated() and not request.COOKIES.get('user'):
            response.set_cookie("user", 'Hello Cookie')
        elif not request.user.is_authenticated() and request.COOKIES.get('user'):
            #else if if no user and cookie remove user cookie, logout
            response.delete_cookie("user")
        return response

3
投票

django.contrib.auth 是为您的网站添加登录功能的最佳方式。这个应用程序。django.contrib.session 应用和中间件。

会话中间件会在用户的浏览器中为你设置一个cookie后,寻找。然后,在你的代码中,这意味着你需要装饰你的视图来强制用户登录。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

在你的视图中,你将可以访问到

  • request.session,这是一个 dict 在那里你可以跨会话存储数据
  • request.user,也就是 用户 对象

我建议你阅读文档。文档是Django最好的部分之一。


0
投票

https:/docs.djangoproject.comen3.0refrequest-response#django.http.HttpResponse.set_cookie。 请参考这个链接了解内置函数的各个参数。

在应用程序中创建signal.py,你的用户模型就在其中,或者添加到主项目目录中,然后在signal.py中添加以下代码段。

from django.db.models.signals import pre_save, pre_delete, post_save, post_delete
from django.dispatch import receiver
from django.dispatch import Signal
from allauth.account.signals import user_logged_in # it signal for post login 
from django.shortcuts import render

@receiver(user_logged_in) # Decorator of receiving signal while user going to logged in
def post_login(sender, user, request, response, **kwargs):
    response.set_cookie('team', 'india') # This will set cookie
    return response

在给定的代码段中,默认的响应将在参数中出现,所以直接重定向到该响应,如果你想改变,则使用renderredirect django.shortcuts方法渲染其他模板,如下面。

response = render(request, 'base.html', {})

© www.soinside.com 2019 - 2024. All rights reserved.