Как сохранить IP-адрес в базе данных и Django admin
хотел бы сохранить IP-адрес всех, кто приходит на сайт. Каков наилучший подход для этого. Скажем, есть модель
class ip(models.Model):
pub_date = models.DateTimeField('date published')
ip_address = models.GenericIPAddressField()
каким будет код в моделях или представлениях или где-то, что я бы сохранил его в базе данных, также хотел бы сохранить его с информацией о пользователе-агенте, подобной этому.
4 ответов
In views.py:
views.py:
....
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ipaddress = x_forwarded_for.split(',')[-1].strip()
else:
ipaddress = request.META.get('REMOTE_ADDR')
get_ip= ip() #imported class from model
get_ip.ip_address= ipaddress
get_ip.pub_date = datetime.date.today() #import datetime
get_ip.save()
Я привел пример из @Sahil Kalra, используя промежуточное ПО,
модель:
class IpAddress(models.Model):
pub_date = models.DateTimeField('date published')
ip_address = models. GenericIPAddressField()
промежуточное:
import datetime
class SaveIpAddressMiddleware(object):
"""
Save the Ip address if does not exist
"""
def process_request(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get('REMOTE_ADDR')
try:
IpAddress.objects.get(ip_address=ip)
except IpAddress.DoesNotExist: #-----Here My Edit
ip_address = IpAddress(ip_address=ip, pub_date=datetime.datetime.now())
ip_address.save()
return None
сохраните промежуточное ПО в папке проекта и в файле настроек добавьте это промежуточное ПО. Вот ссылка Как установить промежуточное ПО django в файле настроек
вы можете получить IP-адрес очень легко в ваш views.py - ...
def get_ip_address(request): """ use requestobject to fetch client machine's IP Address """ 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') ### Real IP address of client Machine return ip def home(request): """ your vies to handle http request """ ip_address = get_ip_address(request)
Как вы хотите сохранить агент пользователя независимо от URL или представления, которое называется не имеет никакого смысла чтобы написать этот код в представлениях или моделях.
вы должны написать промежуточного это сделает работу за вас. Подробнее о промежуточного Джанго : https://docs.djangoproject.com/en/1.6/topics/http/middleware/
вы хотите переехать process_request()
способ настраиваемого промежуточного получить IPaddress и useragent из объекта запроса и хранить его в IP-модели
приведенная выше ссылка даст вам абсолютную ясность о том, что делать.