Хранение IP-адреса пользователя в базе данных django по запросам POST - PullRequest
1 голос
/ 27 мая 2019

Пытаясь сохранить 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()

и путем редактирования поля ввода в моем шаблоне.

1 Ответ

0 голосов
/ 28 мая 2019

Управляется, чтобы заставить его работать должным образом, изменив views.py с.

if form.is_valid():
    form.ip_address = get_client_ip(request)
    form.save()

до *. * 1004

if form.is_valid():
    obj = form.save(commit=False)
    obj.ip_address = get_client_ip(request)
    obj.save()

и путем редактирования поля ввода в моем шаблоне.

Для тех, кто может прочитать это, вы также должны принять к сведению комментарий Кевина и полностью исключить поле ip_address из формы вместо использования скрытого ввода в шаблоне.

...