Пытаясь сохранить IP-адрес пользователя при отправке POST
запросов через отправку моей формы, попытался получить несколько предложений по получению IP-адреса, но мне не удалось заставить его работать должным образом, поскольку я всегда получаю null
значения, хранящиеся для IP в таблице базы данных.
Я попытался использовать формы моделей и задать IP-адрес как переменную внутри формы, чтобы легче было сохранить его в базе данных, используя request.META.get
и x_forwarded_for
, чтобы получить фактический адрес из запроса в views.py ,
Мое приложение построено, как показано ниже:
models.py:
class RequestPull(models.Model):
a = models.CharField(max_length=10)
b = models.CharField(max_length=10)
ip_address = models.GenericIPAddressField(null=True)
forms.py:
class GetReq(forms.ModelForm):
class Meta:
model = RequestPull
fields = ['a','b','ip_address']
views.py (одна из попыток, которые дают одинаковые значения результата-нуля в базе данных):
def get_client_ip(request):
remote_address = request.META.get('HTTP_X_FORWARDED_FOR') or request.META.get('REMOTE_ADDR')
ip = remote_address
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
proxies = x_forwarded_for.split(',')
while (len(proxies) > 0 and proxies[0].startswith(PRIVATE_IPS_PREFIX)):
proxies.pop(0)
if len(proxies) > 0:
ip = proxies[0]
print"IP Address",ip
return ip
def reqPull(request):
if request.method == 'GET':
form = GetReq()
else:
form = GetReq(request.POST)
if form.is_valid():
form.ip_address = get_client_ip(request)
form.save()
Ожидаемый результат - IP-адрес пользователя в качестве одного из значений формы, который будет сохранен в базе данных.
Фактический результат, как было сказано ранее, это допустимые значения для каждого поля в форме, кроме IP-адреса, который всегда сохраняется как null
.
Edit.
Удалось заставить его работать должным образом, изменив views.py с.
if form.is_valid():
form.ip_address = get_client_ip(request)
form.save()
к.
if form.is_valid():
obj = form.save(commit=False)
obj.ip_address = get_client_ip(request)
obj.save()
и путем редактирования поля ввода в моем шаблоне.