首先明确一下自己在做什么:
我想要在一个本地Linux机器上面抓取一些数据(脚本使用python2实现),并且把抓取到的数据通过requests.post发送到我部署在windows上的django服务器上面。
一开始遇到的问题:
因为django是默认打开127.0.0.1:8000这个url的,所以一开始也没有增加改动,但是当我post的时候,本地机器报错:
试了很多办法,比如关闭selinux,关闭iptables等等都不行,最后想到,在post数据的时候,不是发送到127.0.0.1:8000,因为在Linux上面post到127.0.0.1是post到了这一台Linux机器自己的地址(因为127.0.0.1是代表本地地址的),根本就没有发送到我django的机器上面,我的django是在windows上面的pycharm运行的,django的127.0.0.1其实指的是我Windows本地连接的ipv4地址:
所以我更改了我脚本里面要post到的地址,也就是更改为了192.168.2.144,post成功。
下面贴一下自己的代码:
1.Linux机器上抓取数据的脚本
**这里要注意:
requests模块发送请求有data、params两种携带参数的方法。
params在get请求中使用,data在post请求中使用。
**
#!/usr/bin/env python
#coding:utf-8
import sys
import os
import urllib, httplib
from datetime import datetime
import psutil
import logging
import socket
import requests
url = "http://192.168.2.144:8000/monitor_data/getdata/"
headers = {"Content-Type":"application/json"}
#执行的结果放入log
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s [%(levelname)s] %(message)s',
filename=sys.path[0]+'/omsys.log',
filemode='a')
#用post发送数据
def post_metric(http_param=""):
try:
response = requests.post(url=url, data=http_param)
print response.status_code
# f = open('response_page.txt', 'w')
# f.write(response.read())
# if response.status_code != 200:
# logging.error('response http status error:'+str(response.bad_r.status_code))
# sys.exit()
except Exception as e:
logging.error('connection django server error'+str(e))
sys.exit()
# finally:
# if http_client:
# http_client.close()
# else:
# logging.error('connection unknow error')
# sys.exit()
#利用util获取本机ip
def get_netcard():
netcard_info = []
info = psutil.net_if_addrs()
for k,v in info.items():
for item in v:
if item[0] == 2 and not item[1]=='127.0.0.1':
netcard_info.append((k,item[1]))
return netcard_info
myip = get_netcard()[0][1]
History_Id = int(24)
#将当前时间转换为字符串类型
History_datetime = str(datetime.now())
#获取本地cpu负载中的过去一分钟的负载平均值
History_cpu_load = int(os.getloadavg()[0])
#利用psutil获取磁盘使用,内存使用
History_disk_usage = int(psutil.disk_usage("/")[3])
History_memory_usage = int(psutil.virtual_memory()[2])
payload = {
"id": History_Id,
"history_ip": myip,
"history_datetime": History_datetime,
"history_cpu_load": History_cpu_load,
"history_disk_usage": History_disk_usage,
"history_memory_usage": History_memory_usage
}
#调用post_metric函数,并传入编码好的数据
post_metric(payload)
2.django端接收数据(views.py)
@csrf_exempt
@api_view(['GET', 'POST'])
def getdata(request, format=None):
if request.method == 'GET':
serverparameter = ServerParameter.objects.all().order_by('-id')
serializer = MySerializer(serverparameter, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = MySerializer(data=request.data)
if serializer.is_valid():
serializer.save()
try:
if float(serializer.data.get('history_disk_usage')) > 10.0:
print("报警:磁盘使用率过高!")
send_mail(
subject='报警邮件',
message='磁盘使用率过高',
from_email='531904940@qq.com',
recipient_list=['958749352@qq.com'],
fail_silently=False
)
if float(serializer.data.get('history_cpu_load')) > 10.0:
print("报警:cpu负载过高!")
send_mail(
subject='报警邮件',
message='cpu负载过高',
from_email='531904940@qq.com',
recipient_list=['958749352@qq.com'],
fail_silently=False
)
if float(serializer.data.get('history_memory_usage')) > 10.0:
print("报警:内存使用率过高!")
send_mail(
subject='报警邮件',
message='内存使用率过高',
from_email='531904940@qq.com',
recipient_list=['958749352@qq.com'],
fail_silently=False
)
except Exception as e:
return HttpResponse("入库失败,请与亲爱的晋哥联系" + str(e))
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)