Python[7] :Python製作j

api(應用程序編程接口)

API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基於某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。

繼承前幾篇文章,圍繞資產管理搜集的信息,進行這篇文章的api

一、sqlite數據庫的基本使用

資產管理的後台數據庫用的是sqlite,這個是輕量級的數據庫,大家可能對這個數據庫很陌生。那麼我們就簡單的來看看這個數據庫是如何使用的?

1、登陸sqlite

[root@localhost ~]# cd Simplecmdb  [root@localhost Simplecmdb]# ls  Boot_django.sh        curl_post_test_v2.sh  db.sqlite3  manage.py         Simplecmdb  curl_post_test_v1.sh  curl_post_test_v3.py  hostinfo    post_hostinfo.py  [root@localhost Simplecmdb]# python manage.py shell  /usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py:58: RuntimeWarning: SQLite received a naive datetime (2015-03-03 16:18:21.229988) while time zone support is active.    RuntimeWarning)  Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18)   Type "copyright", "credits" or "license" for more information.    IPython 1.2.1 -- An enhanced Interactive Python.  ?         -> Introduction and overview of IPython's features.  %quickref -> Quick reference.  help      -> Python's own help system.  object?   -> Details about 'object', use 'object??' for extra details.    In [1]:

2、查看models.py

文件中有Host和HostGroup兩個類,每個類中都定義了字段名和數據類型

[root@localhost Simplecmdb]# cat hostinfo/models.py  from django.db import models    # Create your models here.  class Host(models.Model):      hostname = models.CharField(max_length=50)      ip = models.IPAddressField()      osversion = models.CharField(max_length=50)      memory = models.CharField(max_length=50)      disk = models.CharField(max_length=50)      vendor_id = models.CharField(max_length=50)      model_name = models.CharField(max_length=50)      cpu_core = models.CharField(max_length=50)      product = models.CharField(max_length=50)      Manufacturer = models.CharField(max_length=50)      sn = models.CharField(max_length=50)        def __str__(self):  	return self.hostname    class HostGroup(models.Model):      groupname = models.CharField(max_length=50)      members = models.ManyToManyField(Host)

3、將資產管理數據結構導入到當前的環境中並使用

In [1]: from hostinfo.models import *    In [3]: HostGroup.    #有很多方法可以使用  HostGroup.DoesNotExist             HostGroup.delete                   HostGroup.save  HostGroup.MultipleObjectsReturned  HostGroup.full_clean               HostGroup.save_base  HostGroup.add_to_class             HostGroup.members                  HostGroup.serializable_value  HostGroup.clean                    HostGroup.mro                      HostGroup.unique_error_message  HostGroup.clean_fields             HostGroup.objects                  HostGroup.validate_unique  HostGroup.copy_managers            HostGroup.pk                         HostGroup.date_error_message       HostGroup.prepare_database_save      In [3]: HostGroup.objects.all()    #查看類中所有的對象(5個),返回值為列表  Out[3]: [<HostGroup: HostGroup object>, <HostGroup: HostGroup object>, <HostGroup: HostGroup object>, <HostGroup: HostGroup object>, <HostGroup: HostGroup object>]    In [5]: hg = HostGroup.objects.all()[0]    #取第一個對象並賦值為hg    In [6]: hg.    #hg中的方法  hg.DoesNotExist             hg.delete                   hg.objects                  hg.serializable_value  hg.MultipleObjectsReturned  hg.full_clean               hg.pk                       hg.unique_error_message  hg.clean                    hg.groupname                hg.prepare_database_save    hg.validate_unique  hg.clean_fields             hg.id                       hg.save                       hg.date_error_message       hg.members                  hg.save_base                    In [6]: hg.groupname    #查看對應的組的名字  Out[6]: u'nginx'    In [7]: hg.members    #查看成員,返回值是一個對象,是對象就有方法和屬性  Out[7]: <django.db.models.fields.related.ManyRelatedManager at 0x2156f10>    In [8]: hg.members.all()    #查看所有成員  Out[8]: [<Host: nginx_master.com>, <Host: nginx_slave.com>]    In [10]: h = hg.members.all()[0]    In [12]: h.  h.DoesNotExist             h.delete                   h.memory                   h.save  h.Manufacturer             h.disk                     h.model_name               h.save_base  h.MultipleObjectsReturned  h.full_clean               h.objects                  h.serializable_value  h.clean                    h.hostgroup_set            h.osversion                h.sn  h.clean_fields             h.hostname                 h.pk                       h.unique_error_message  h.cpu_core                 h.id                       h.prepare_database_save    h.validate_unique  h.date_error_message       h.ip                       h.product                  h.vendor_id    In [12]: h.hostname  Out[12]: u'nginx_master.com'    In [13]: h.ip  Out[13]: u'192.168.1.200'    In [14]: h.ip = '192.168.1.234'    #修改記錄    In [15]: h.ip  Out[15]: '192.168.1.234'    In [16]: h.save()    #保存到數據庫中,會在後台admin頁面中看到

二、api(json)

1、實現json格式api的草圖

2、在命令行中實現上述效果

[root@localhost Simplecmdb]# python manage.py shell  /usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py:58: RuntimeWarning: SQLite received a naive datetime (2015-03-03 16:36:45.158750) while time zone support is active.    RuntimeWarning)  Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18)   Type "copyright", "credits" or "license" for more information.    IPython 1.2.1 -- An enhanced Interactive Python.  ?         -> Introduction and overview of IPython's features.  %quickref -> Quick reference.  help      -> Python's own help system.  object?   -> Details about 'object', use 'object??' for extra details.    In [1]: from hostinfo.models import *    In [2]: d = []    In [3]: hg = HostGroup.objects.all()    In [4]: for g in hg:     ...:         ret = {'groupname':g.groupname,'members':[]}     ...:         for h in g.members.all():     ...:                 ret_h = {'hostname':h.hostname,'ip':h.ip}     ...:                 ret['members'].append(ret_h)     ...:         d.append(ret)     ...:             In [5]: print d  [{'groupname': u'nginx', 'members': [{'ip': u'192.168.1.234', 'hostname': u'nginx_master.com'}, {'ip': u'192.168.1.201', 'hostname': u'nginx_slave.com'}]}, {'groupname': u'mongodb', 'members': [{'ip': u'192.168.1.121', 'hostname': u'mongodb.com'}]}, {'groupname': u'db', 'members': [{'ip': u'192.168.1.105', 'hostname': u'mysql_master.com'}, {'ip': u'192.168.1.106', 'hostname': u'mysql_slave.com'}]}, {'groupname': u'tomcat', 'members': [{'ip': u'192.168.1.109', 'hostname': u'tomcat_node1.com'}, {'ip': u'192.168.1.110', 'hostname': u'tomcat_node2.com'}, {'ip': u'192.168.1.111', 'hostname': u'tomcat_node3.com'}, {'ip': u'192.168.1.112', 'hostname': u'tomcat_node4.com'}]}, {'groupname': u'memcached', 'members': [{'ip': u'192.168.1.120', 'hostname': u'memory.com'}]}]    對上述列表遍歷能看的更清楚  In [6]: for i in d:     ...:     print i     ...:       {'groupname': u'nginx', 'members': [{'ip': u'192.168.1.234', 'hostname': u'nginx_master.com'}, {'ip': u'192.168.1.201', 'hostname': u'nginx_slave.com'}]}  {'groupname': u'mongodb', 'members': [{'ip': u'192.168.1.121', 'hostname': u'mongodb.com'}]}  {'groupname': u'db', 'members': [{'ip': u'192.168.1.105', 'hostname': u'mysql_master.com'}, {'ip': u'192.168.1.106', 'hostname': u'mysql_slave.com'}]}  {'groupname': u'tomcat', 'members': [{'ip': u'192.168.1.109', 'hostname': u'tomcat_node1.com'}, {'ip': u'192.168.1.110', 'hostname': u'tomcat_node2.com'}, {'ip': u'192.168.1.111', 'hostname': u'tomcat_node3.com'}, {'ip': u'192.168.1.112', 'hostname': u'tomcat_node4.com'}]}  {'groupname': u'memcached', 'members': [{'ip': u'192.168.1.120', 'hostname': u'memory.com'}]}

3、api(json)

 3.1、添加訪問的api的url

[root@localhost Simplecmdb]# vim Simplecmdb/urls.py    from django.conf.urls import patterns, include, url    from django.contrib import admin  admin.autodiscover()    urlpatterns = patterns('',      # Examples:      # url(r'^$', 'Simplecmdb.views.home', name='home'),      # url(r'^blog/', include('blog.urls')),        url(r'^admin/', include(admin.site.urls)),      url(r'^hostinfo$','hostinfo.views.index'),      url(r'^hostinfo/getjson$','hostinfo.views.getjson'),  )

  3.2、定義響應請求的視圖文件

[root@localhost Simplecmdb]# vim hostinfo/views.py    from django.shortcuts import render  from django.http import HttpResponse  from hostinfo.models import Host  from hostinfo.models import HostGroup  import pickle  import json    # Create your views here.  def index(req):      if req.method == 'POST':          pick_obj = json.loads(req.body)          hostname = pick_obj['hostname']          ip = pick_obj['ip']          osversion = pick_obj['osversion']          memory = pick_obj['memory']          disk = pick_obj['disk']          vendor_id = pick_obj['vendor_id']          model_name = pick_obj['model_name']          cpu_core = pick_obj['cpu_core']          product = pick_obj['product']          Manufacturer = pick_obj['Manufacturer']          sn = pick_obj['sn']            try:              host = Host.objects.get(hostname=hostname)          except:              host = Host()          host.hostname = hostname          host.ip = ip          host.osversion = osversion          host.memory = memory          host.disk = disk          host.vendor_id = vendor_id          host.model_name = model_name          host.cpu_core = cpu_core          host.product = product          host.Manufacturer = Manufacturer          host.sn = sn          host.save()          return HttpResponse('ok')      else:          return HttpResponse('no data')    #添加如下行  def getjson(req):      hg = HostGroup.objects.all()      d = []      for g in hg:          ret = {'groupname':g.groupname,'members':[]}          for h in g.members.all():              ret_h = {'hostname':h.hostname,'ip':h.ip}              ret['members'].append(ret_h)          d.append(ret)      return HttpResponse(json.dumps(d))

 3.3、瀏覽器訪問(需要注意,必須啟動JSONView才能如下顯示)

三、api(shell)

1、實現json格式api的草圖

API  -----shell格式-----  web  node1 192.168.1.10  web  node2 192.168.1.11  db   node3 192.168.1.11

2、api(shell)

2.1、添加訪問的api的url

[root@localhost Simplecmdb]# vim Simplecmdb/urls.py    from django.conf.urls import patterns, include, url    from django.contrib import admin  admin.autodiscover()    urlpatterns = patterns('',      # Examples:      # url(r'^$', 'Simplecmdb.views.home', name='home'),      # url(r'^blog/', include('blog.urls')),        url(r'^admin/', include(admin.site.urls)),      url(r'^hostinfo$','hostinfo.views.index'),      url(r'^hostinfo/getjson$','hostinfo.views.getjson'),      url(r'^hostinfo/gettxt$','hostinfo.views.gettxt'),  )

2.2、定義響應請求的視圖文件

[root@localhost Simplecmdb]# vim hostinfo/views.py    from django.shortcuts import render  from django.http import HttpResponse  from hostinfo.models import Host  from hostinfo.models import HostGroup  import pickle  import json    # Create your views here.  def index(req):      if req.method == 'POST':          pick_obj = json.loads(req.body)          hostname = pick_obj['hostname']          ip = pick_obj['ip']          osversion = pick_obj['osversion']          memory = pick_obj['memory']          disk = pick_obj['disk']          vendor_id = pick_obj['vendor_id']          model_name = pick_obj['model_name']          cpu_core = pick_obj['cpu_core']          product = pick_obj['product']          Manufacturer = pick_obj['Manufacturer']          sn = pick_obj['sn']            try:              host = Host.objects.get(hostname=hostname)          except:              host = Host()          host.hostname = hostname          host.ip = ip          host.osversion = osversion          host.memory = memory          host.disk = disk          host.vendor_id = vendor_id          host.model_name = model_name          host.cpu_core = cpu_core          host.product = product          host.Manufacturer = Manufacturer          host.sn = sn          host.save()          return HttpResponse('ok')      else:          return HttpResponse('no data')      def getjson(req):      hg = HostGroup.objects.all()      d = []      for g in hg:          ret = {'groupname':g.groupname,'members':[]}          for h in g.members.all():              ret_h = {'hostname':h.hostname,'ip':h.ip}              ret['members'].append(ret_h)          d.append(ret)      return HttpResponse(json.dumps(d))    #添加如下行  def gettxt(req):      str = ''      hg = HostGroup.objects.all()      for g in hg:          for h in g.members.all():              str += g.groupname + h.hostname + ' ' + h.ip + ' ' + 'n'      return HttpResponse(str)

2.3 瀏覽器訪問

2.4 命令行訪問

[root@localhost ~]# curl http://192.168.1.210/hostinfo/gettxt  nginxnginx_master.com 192.168.1.234   nginxnginx_slave.com 192.168.1.201   mongodbmongodb.com 192.168.1.121   dbmysql_master.com 192.168.1.105   dbmysql_slave.com 192.168.1.106   tomcattomcat_node1.com 192.168.1.109   tomcattomcat_node2.com 192.168.1.110   tomcattomcat_node3.com 192.168.1.111   tomcattomcat_node4.com 192.168.1.112   memcachedmemory.com 192.168.1.120