[英]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_in
、 user_logged_out
和user_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.