【发布时间】:2019-10-13 04:10:39
【问题描述】:
当他通过提交我的表单发送POST 请求时尝试存储用户的 IP 地址,尝试了很多关于获取 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。
编辑。 通过更改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