site - Cómo almacenar la dirección IP en la base de datos y django admin
framework django para python (4)
Quisiera almacenar la dirección IP de todos los que vienen al sitio. ¿Cuál es el mejor enfoque para hacer esto. Digamos que tenemos modelo
class ip(models.Model):
pub_date = models.DateTimeField(''date published'')
ip_address = models.GenericIPAddressField()
¿Cuál sería el código en modelos o en vistas o en algún lugar donde lo guardaría en la base de datos? También me gustaría guardarlo con información de usuario-agente similar a esta.
Como desea guardar el agente de usuario independientemente de la URL o la Vista que se está llamando, no tiene ningún sentido escribir este código en las Vistas o Modelos.
Debería escribir un middleware que haría el trabajo por usted. Obtenga más información sobre el middleware Django: https://docs.djangoproject.com/en/1.6/topics/http/middleware/
Desea process_request()
método process_request()
de su middleware personalizado para obtener la dirección IP y el agente de usuario del objeto de solicitud y almacenarlo en el modelo IP
El enlace anterior le dará claridad absoluta sobre qué hacer.
En 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()
He dado el ejemplo de @Sahil Kalra usando middleware,
Modelo:
class IpAddress(models.Model):
pub_date = models.DateTimeField(''date published'')
ip_address = models. GenericIPAddressField()
Middleware:
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
Guarde el middleware en algún lugar de la carpeta de su proyecto y en el archivo de configuración agregue este middleware. Aquí está la referencia Cómo configurar el middleware django en el archivo de configuración
Puede obtener la dirección IP muy fácilmente en su 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)