Python Django项目范围内的用户ip日志记录
是否可以为已经存在的站点登录一个系统,该系统记录每个用户的详细信息(如果登录了他们的cookie和用户名)和ip地址。您最好的选择是编写自己的中间件类 它看起来像这样:Python Django项目范围内的用户ip日志记录,python,django,Python,Django,是否可以为已经存在的站点登录一个系统,该系统记录每个用户的详细信息(如果登录了他们的cookie和用户名)和ip地址。您最好的选择是编写自己的中间件类 它看起来像这样: class LogUserDetailsMiddleware(object): def process_request(self, request): print 'user: ' + request.user print 'ip-address: ' + request.META.g
class LogUserDetailsMiddleware(object):
def process_request(self, request):
print 'user: ' + request.user
print 'ip-address: ' + request.META.get('REMOTE_ADDR')
不要忘记在
AuthenticationMiddleware
(因此request.user
excists)之后,将您的中间件类添加到您的settings.py中的Middleware\u类中
class SetRemoteAddrFromForwardedFor(object):
def process_request(self, request):
try:
real_ip = request.META['HTTP_X_FORWARDED_FOR']
except KeyError:
pass
else:
# HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
# Take just the first one.
real_ip = real_ip.split(",")[0]
#request.META['REMOTE_ADDR'] = real_ip
if request.user.is_authenticated():
email = request.user.email
user_id = request.user.id
else:
email,user_id = "",""
today = datetime.date.today()
try:
user = UserLog.objects.get(ip=real_ip, date=today, email=email)
except:
user = UserLog(ip=real_ip, email=email, user_id=user_id)
if user.visits:
user.visits +=1
else:
user.visits = 1
user.save()
log = LogTime(page=user)
log.save()
class LogTime(models.Model):
page = models.ForeignKey('UserLog', related_name="times",)
time = models.TimeField(auto_now=True, blank=True)
class Meta:
ordering = ['page', 'time',]
verbose_name = 'Log Time'
def __unicode__(self):
return self.page
class UserLog(models.Model):
date = models.DateField(default=datetime.date.today(), blank=True, null=True)
ip = models.CharField(max_length=100, blank=True, )
email = models.CharField(max_length=100, blank=True, )
user_id = models.CharField(max_length=100, blank=True, )
visits = models.IntegerField(default=1, blank=True, null=True)
class Meta:
ordering = ['visits','date']
verbose_name = 'User Log'
def __unicode__(self):
return "{0} {1}: {2} Visits Today: {3}".format(self.date, self.ip, self.email, self.visits)
是的,例如,您可以为此编写自己的中间件。