【问题标题】:Where in my django app do I implement this get_client_ip() function?在我的 django 应用程序中,我在哪里实现这个 get_client_ip() 函数?
【发布时间】:2023-03-18 05:59:01
【问题描述】:

我有一个采用用户 IP 地址的自定义用户模型。 我想在完成注册表单后添加用户的 IP 地址我在哪里实现以下代码?我不确定是否将其放入我的 forms.py 或 views.py 文件中。

def get_client_ip(request):
    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')
    return ip

我希望能够在注册时将用户的 IP 地址保存到我的自定义用户表中。

【问题讨论】:

  • 你可以用 request obj 实例化一个表单。或仅在表单保存时传递请求 obj。

标签: python django geoip


【解决方案1】:

我更喜欢forms,以便它可以轻松测试。您必须在表单初始化期间将请求 obj 与其他表单 kwarg 一起传递,或者您只能在表单保存期间传递请求 obj(即到 form.save 方法)。

forms.py

class UserForm(forms.ModelForm):
    ...
    def save(self, commit=True, request=None):
        # User creation logic
        user = super().save(commit=commit)
        if request:
            ip = get_client_ip(request)
            user.ip = ip
            if commit: user.save()
        return user

views.py

form = UserForm(request.POST)
if form.is_valid():
    form.save(request=self.request)

【讨论】:

  • 非常感谢,这更有意义。我无法弄清楚如何传递请求对象。 request=None 有什么作用?
  • 如果你通过请求,那么它会从它计算用户 ip(用户 obj 用 ip 值保存),否则它不会(即用户 obj 没有 ip 值保存)。这在您只想保存用户并且不想填充 ip 字段的测试期间很有帮助。
【解决方案2】:

在您的意见中.py 之后的任何函数内部 定义你的功能(请求): 你已准备好出发! 为了好玩,并检查它是否有效: 打印(get_client_ip(请求))

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多