Comment obtenir l'identifiant de l'utilisateur actuellement connecté dans Django?


124

Comment obtenir l'identifiant de l'utilisateur actuellement connecté?

dans models.py:

class Game(models.model):
    name = models.CharField(max_length=255)
    owner = models.ForeignKey(User, related_name='game_user', verbose_name='Owner')

dans views.py:

gta = Game.objects.create(name="gta", owner=?)


1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Exact Duplicate
Tessaracter

Réponses:


209

Tout d' abord vous assurer que vous avez SessionMiddlewareet AuthenticationMiddlewareintergiciels ajouté à votre MIDDLEWARE_CLASSESréglage.

Le courant userest dans l' requestobjet, vous pouvez l'obtenir par:

def sample_view(request):
    current_user = request.user
    print current_user.id

request.uservous donnera un Userobjet représentant l'utilisateur actuellement connecté. Si un utilisateur n'est pas actuellement connecté, request.usersera défini sur une instance de AnonymousUser. Vous pouvez les distinguer avec le terrain is_authenticated, comme ceci:

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.


3
Que faire si nous voulons définir l'ID utilisateur de la clé étrangère sur un modèle qui est l'ID de l'utilisateur actuellement connecté?
Krishnadas PC

Vous n'avez plus besoin de mettre à jour les paramètres. docs.djangoproject.com/en/1.11/topics/auth/default/…
wooden_metal

2
D'où vient la demande?
Sören

Lien vers la référence du Usermodèle .
x-yuri

22

Vous pouvez accéder à l'utilisateur actuellement connecté à l'aide du code suivant:

request.user.id

7

En supposant que vous faites référence à l' utilisateur d'authentification de Django , à votre avis:

def game(request):
  user = request.user

  gta = Game.objects.create(name="gta", owner=user)

0

J'ai écrit ceci dans une vue ajax, mais c'est une réponse plus complète donnant la liste des utilisateurs actuellement connectés et déconnectés.

L' is_authenticatedattribut retourne toujours Truepour mes utilisateurs, ce qui, je suppose, est attendu car il ne vérifie que les utilisateurs anonymes, mais cela s'avère inutile si vous deviez dire développer une application de chat où vous devez afficher les utilisateurs connectés.

Cela vérifie les sessions expirées, puis détermine à quel utilisateur elles appartiennent en fonction de l' _auth_user_idattribut décodé :

def ajax_find_logged_in_users(request, client_url):
    """
    Figure out which users are authenticated in the system or not.
    Is a logical way to check if a user has an expired session (i.e. they are not logged in)
    :param request:
    :param client_url:
    :return:
    """
    # query non-expired sessions
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    user_id_list = []
    # build list of user ids from query
    for session in sessions:
        data = session.get_decoded()
        # if the user is authenticated
        if data.get('_auth_user_id'):
            user_id_list.append(data.get('_auth_user_id'))

    # gather the logged in people from the list of pks
    logged_in_users = CustomUser.objects.filter(id__in=user_id_list)
    list_of_logged_in_users = [{user.id: user.get_name()} for user in logged_in_users]

    # Query all logged in staff users based on id list
    all_staff_users = CustomUser.objects.filter(is_resident=False, is_active=True, is_superuser=False)
    logged_out_users = list()
    # for some reason exclude() would not work correctly, so I did this the long way.
    for user in all_staff_users:
        if user not in logged_in_users:
            logged_out_users.append(user)
    list_of_logged_out_users = [{user.id: user.get_name()} for user in logged_out_users]

    # return the ajax response
    data = {
        'logged_in_users': list_of_logged_in_users,
        'logged_out_users': list_of_logged_out_users,
    }
    print(data)

    return HttpResponse(json.dumps(data))

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.