简体   繁体   English

每次用户在 Django 中登录和注销时,如何登录?

[英]How can I log every time a user has logged in and logged out in Django?

I am trying to log every time a user has logged in or logged out in Django.每次用户登录或注销 Django 时,我都会尝试登录。 I am using the default login and logout views by Django.我正在使用 Django 的默认登录和注销视图。 How can I implement logging these easily without the need for a model to store them?如何在不需要 model 来存储它们的情况下轻松实现这些记录? Only using logging also if possible that I can edit these default views in my views.py this can be much easier如果可能的话,只使用日志记录,我可以在我的views.py中编辑这些默认视图,这会容易得多

My views.py code:我的views.py代码:

from django.shortcuts import render,redirect
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.db.models import Q
from .models import *
from .forms import *
import logging


logger = logging.getLogger('django')

def TransactionQuery(request):
        userAccounts = Account.objects.filter(Account_User = request.user).all()
        allTransactions = Transaction.objects.filter( Q(Transaction_From__in = [account.Account_ID for account in userAccounts]) | Q(Transaction_To__in = [account.Account_ID for account in userAccounts])).all()
        return allTransactions

def about (request):
    ip = get_client_ip(request)
    print(ip)
    return render(request, 'website/about.html',{'title': 'About'})

def home (request):
    return render(request, 'website/home.html',{'title': 'Home'})

@login_required
def profile (request):
    return render(request, 'website/profile.html',{'title': 'Profile'})

@login_required
def dashboard (request):
    contex = {
    'accounts': Account.objects.filter(Account_User=request.user).all(),
    'transactions':TransactionQuery(request),
    'title': 'Dashboard'
    }
    return render(request, 'website/dashboard.html',contex)

def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username1 = form.cleaned_data.get('username')
            usr= User.objects.filter(username=username1).first()
            acc=Account(Account_User=usr)
            acc.save()
            logger.info(f'Account created for {username1}')
            messages.success(request, f'Account created for {username1}! you can log in now')
            return redirect('login-page')
    else:
        form = UserRegisterForm()
    return render(request, 'website/register.html', {'form': form})

@login_required
def transfer (request):
    accs1=[]
    accs=Account.objects.filter(Account_User=request.user)
    for acc in accs:
        accs1.append(str(acc.Account_ID))
    acc_dictionary =dict(zip(accs1,accs1))  
    if request.method == 'POST':
        
        form= MoneyTransfer(request.POST,acc=acc_dictionary)
        if form.is_valid():
            from_acc = form.cleaned_data.get('from_account')
            to_acc = form.cleaned_data.get('to_account')
            check = Account.objects.all()
            amount = form.cleaned_data.get('amount')
            for i in check:
                if(i.Account_ID == to_acc):
                    acc1=Account.objects.filter(Account_ID=from_acc).first()
                    acc2=Account.objects.filter(Account_ID=to_acc).first()
                    acc1.Account_Balance -=amount
                    acc2.Account_Balance +=amount
                    acc1.save()
                    acc2.save()
                    trans = Transaction(Transaction_From = from_acc,Transaction_To = to_acc,Transaction_Amount = amount)
                    trans.save()
                    logger.info(f'transaction with amount:{amount} was made from: {acc1} to: {acc2}')
                    messages.success(request, f'Money Has Been Successfuly Transfered ')
                    return redirect('dashboard-page')
            logger.info(f'transaction faild! with amount: {amount} to Account: {to_acc} does not exist')
            messages.warning(request, f'transaction faild! Account: {to_acc} does not exist please enter a valid account')
            return render(request, 'website/transfer.html',{'form':form})
    else:
        form = MoneyTransfer(acc=acc_dictionary)
    return render(request, 'website/transfer.html',{'form':form})


#https://www.codegrepper.com/code-examples/python/get+user+ip+address+django
#getting ips from the user request
def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

You can use the Login and logout signals : user_logged_in , user_logged_out and user_login_failed signals to do this.您可以使用登录和注销信号user_logged_inuser_logged_outuser_login_failed信号来执行此操作。

from django.contrib.auth.signals import user_logged_in, user_login_failed, user_logged_out
from django.dispatch import receiver
import logging


logger = logging.getLogger('django')

@receiver(user_logged_in)
def post_login(sender, request, user, **kwargs):
    logger.info(f'User: {user.username} logged in')

@receiver(user_logged_out)
def post_logout(sender, request, user, **kwargs):
    logger.info(f'User: {user.username} logged out')

@receiver(user_login_failed)
def post_login_fail(sender, credentials, request):
    logger.info(f'Login failed with credentials: {credentials}')

Best would be to write this code in a file signals.py and in your apps apps.py add an import like:最好将此代码写入文件signals.py并在您的应用程序apps.py添加如下导入:

class MyAppConfig(AppConfig):
    ...
    
    def ready(self):
        import myapp.signals  # noqa

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM