看了两天的403,forbidden。。。。禁止禁止,这是一件痛苦的感觉。。。。
1、 背景介绍
在使用web的时候,第一步就是要擅长构建请求request,然后得到响应response,从而就有了用django提供一个接口,然后在另外一个脚本中发送相关的请求到接口中,将数据保存在数据库中。
这种最实用的场景就是,采集各个服务器上的信息,然后将数据保存在数据库中,成为历史数据。
在进行传输数据的时候,使用两种方式,一种是使用GET方法将数据传送到数据库,一种是使用POST方法来进行传输数据,两者之间最大的差别就是,在使用GET方法的时候,是将所有的数据通过url拼接的方式来进行传送;而post方式则是通过表单的方式来进行传送。
2、 django的配置
在django中,主要就是提供访问的接口url,然后就是处理的方法views,然后就是保存在数据库中模型。
具体的代码如下所示:
urls.py:仅仅提供一个url来进行访问,那就是首页,如下:
urlpatterns = [
url(r'^$',index),
]
views.py:提供一个方法来进行保存数据,如下所示(代码未经整理,测试代码):
@ensure_csrf_cookie (强制使用csrf保护机制)
#@csrf_exempt
def index(request):
print request.COOKIES
print request.path
ip = request.GET.get('hostip')
if ip: (处理GET方法)
boot_time = request.GET.get('boot_time')
mem_total = request.GET.get('mem_total')
mem_free =request.GET.get('mem_free')
hostcpu = HostCPU(hostip=ip,boot_time=boot_time,mem_total=mem_total,mem_free=mem_free)
hostcpu.save()
return HttpResponse('GET method')
ip = request.POST.get('hostip')
if ip: (处理POST方法)
boot_time = request.POST.get('boot_time')
mem_total = request.POST.get('mem_total')
mem_free =request.POST.get('mem_free')
hostcpu = HostCPU(hostip=ip,boot_time=boot_time,mem_total=mem_total,mem_free=mem_free)
hostcpu.save()
return HttpResponse("POST method NANA")
数据库模型,如下所示:
class HostCPU(models.Model):
hostip = models.GenericIPAddressField()
boot_time = models.DateTimeField()
mem_total = models.CharField(max_length=100)
mem_free =models.CharField(max_length=100)
3、 采集的脚本
采集的脚本GET方法的代码如下:
while True:
mem = psutil.virtual_memory()
# boot_time = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime('%Y-%m-%d %H:%M:%S')
data = {
'hostip':'192.168.249.236',
'mem_total':str(mem.total),
'mem_free':str(mem.free),
'boot_time':str(boot_time),
}
url = "http://192.168.249.10:9999/kel/"
data = urllib.urlencode(data)
url = "http://192.168.249.10:9999/kel/?"+"hostip=192.168.249.236"+"&mem_total="+str(mem.total)+"&mem_free="+str(mem.free)+"&boot_time="+boot_time
urllib.urlopen(url,data=data)
time.sleep(3)
在使用GET方法的时候,直接数据放在url中,然后发送请求进行接收。
采集的脚本的POST方法的代码如下:
while True:
mem = psutil.virtual_memory()
boot_time = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime('%Y-%m-%d %H:%M:%S')
data = {
'hostip':'192.168.249.236',
'mem_total':str(mem.total),
'mem_free':str(mem.free),
'boot_time':str(boot_time),
}
cj = cookielib.CookieJar()
handler=urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(handler,urllib2.HTTPHandler)
urllib2.install_opener(opener)
url = "http://192.168.249.10:9999/kel/"
data =urllib.urlencode(data)
response = urllib2.urlopen(url)
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
"Host":"192.168.249.10:9999",
}
req = urllib2.Request(url,data,headers=headers)
content = urllib2.urlopen(req)
break
time.sleep(3)
在使用POST方法的时候,使用cookie的主要目的是为了获取到csrf的token值,但是。。。。并没有搞定,从而要想POST方法能够运行,只能将view方法中的csrf检测进行关闭,也就是开启@csrf_exempt注释即可。
4、 查看数据库保存
最后数据库中保存的数据如下:
最简单的数据采集方式,如果做大了,那么可以将每个服务器上的相关机器信息采集起来,从而做到监控的效果,这也是那些监控系统的由来,例如zabbix和nagios等。
5、 未完成的问题
在使用post请求的时候,无法提交,csrf会拒绝这个请求。
出现的错误如下:
如果有人能解决,联系我。。。。