【问题标题】:Storing user's IP address in django's database on POST requests将用户的 IP 地址存储在 django 的数据库中的 POST 请求中
【发布时间】:2019-10-13 04:10:39
【问题描述】:

当他通过提交我的表单发送POST 请求时尝试存储用户的 IP 地址,尝试了很多关于获取 IP 地址的建议,但没有设法使其正常工作,因为我总是得到 null为 IP 存储在数据库表中的值。

我尝试使用模型表单并将 ip 地址设置为表单内的变量,这样我可以使用request.META.getx_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

编辑。 通过更改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()

并通过在我的模板中编辑输入字段。

【问题讨论】:

  • 将您的编辑变成答案并接受它,这将对其他人更有帮助。但是使用这种方法,您应该将ip_address 完全排除在表格之外(不包括在fields 中)。这样您就不必处理将其放入模板等问题。
  • 是的,确实让它变得不那么混乱,并将其添加到评论中,并尽可能将其标记为答案。

标签: python django python-2.7 django-forms


【解决方案1】:

通过更改 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()

并通过在我的模板中编辑输入字段。

对于可能阅读本文的其他人,您还应该注意 Kevin 的评论,并将 ip_address 字段完全排除在表单之外,而不是在模板中使用隐藏输入。

【讨论】:

    【解决方案2】:

    您的return ip 语句缩进太远。拿回 4 个空格,这应该会给你你的 IP 地址。当代码执行期间没有给出明确的return 语句或未命中时,Python 函数返回None。根据这个缩进:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2013-04-25
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2012-08-24
      • 2011-09-19
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多