我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3之api

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3之api

        刚到公司领导安排了一个任务,用Python写一个api接口

        主要用到django,request,json,orm,HttpResponse

        闲话少说上代码

以下是表和需求:

IP资源表:(IpSource)
        id(主键) area(测试环境,仿真环境,线上环境,其他) address prefix netmask network gateway 状态 备注
服务器表:
        id(主键) 资产编号 area(测试环境,仿真环境,线上环境,其他) SN 主机名 内网IP 外网IP(IP资源表address列的外键) CPU 内存 硬盘 RAID U位 机架号 采购价格 采购时间 采购来源 采购人 保修期 状态 责任人
服务表:
        id(主键) 主机名(服务器表"主机名"列的外键) 进程名 服务名 用户 备注
维修表:
        id(主键) 资产类型 资产id 维修描述 维修人 时间
PC表:
        id(主键) 资产编号 品牌 机器类型 内存 CPU 磁盘 采购价格 采购时间 采购来源 采购人 保修期 状态 责任人
移动测试机:
        id(主键) 资产编号 序列号 MAC地址 品牌 操作系统 颜色 内存 采购价格 采购时间 采购来源 采购人 保修期 状态 责任人
通用IT设备表:
        id(主键) 资产编号 资产描述 采购价格 采购时间 采购来源 采购人 保修期 状态 责任人

接口需求:
(1) 返回所有可用的资产类型                           
(2) 根据类型返回该类型的所有资产列表               
(3) 根据资产类型和资产id返回维修信息               
(3) 根据资产类型以及资产id添加/删除维修信息           
(4) 根据资产类型以及资产id修改设备状态               
(5) 根据资产类型以及资产id修改设备责任人        


一、在url路由模块添加访问路径

from django.conf.urls import url
from django.contrib import admin
from app import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^dida_api/',views.dida_api),#这个是我的api的路径
]

二、创建didaapi目录并在下面创建api_class.py

#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.shortcuts import render
import django
import os
from dida7 import settings
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dida7.settings")
django.setup()
from app import models


class api(object):
    def get(self,*args,**kwargs):
        try:
            data_list = []
            type_t = kwargs['type_t']
            id_a = kwargs['id_a']
            if id_a == 'all':
                sql_obj = 'models.%s.objects.all().values()'%(type_t)
            else:
                sql_obj = 'models.%s.objects.filter(id=%s).values()'%(type_t,id_a)
            data = eval(sql_obj)#将字符串执行
            return data#返回一个字典给views.dida_api函数
        except Exception as server_error:
            return '请确认你的字段是否正确'

    def put(self,*args,**kwargs):
        try:
            type_t = kwargs['type_t']
            id_a=kwargs['id']
            kwargs.pop('type_t')
            kwargs.pop('type_c')
            filter_list = []
            for k,y in kwargs.items():
                obj_str = '%s=\'%s\','%(k,y)#循环传过来的字典,k和v,拼接成"k","y",字符串
                filter_list.append(obj_str)#把字符串加入列表
            filter_str = ''.join(filter_list)#把list转换成str,以' '(空)拼接
            obj="models.%s.objects.filter(id=%s).update(%s)"%(type_t,id_a,filter_str)
            #obj 要执行的orm
            r = eval(obj) #把内容写入数据库
            return '成功写入'
        except Exception as e:
            return "请确认字段是否正确"

    def post(self,*args,**kwargs):
        type_t = kwargs['type_t']
        kwargs.pop('type_t')#删除type_t没有在数据库里写这个字段
        kwargs.pop('type_c')#删除type_c没有在数据库里写这个字段
        filter_list = []
        for k,y in kwargs.items():
            obj_str = '%s=\'%s\','%(k,y)#循环传过来的字典,k和v,拼接成"k","y",字符串
            filter_list.append(obj_str)#把字符串加入列表
        filter_str = ''.join(filter_list)#把list转换成str,以' '(空)拼接
        try:
            sql_obj = 'models.%s.objects.create(%s)'%(type_t,filter_str)
            post_r = eval(sql_obj)#把内容写入数据库
            return "写入成功"
        except Exception as e:
            return "请确认字段是否正确"

三、在views视图模块

from didaapi.api_class import api
from django.http import HttpResponse
import json
from django.views.decorators.csrf import csrf_protect,csrf_exempt

@csrf_protect
@csrf_exempt     #防止csrf报错
def dida_api(request):
    api_ojb = api()生成一个api_class的对象,通过对象调用方法
    if request.method == "GET":
        datalis1 =[]
        type_t = request.GET.get('type_t') #获取表名type_t == 表名
        id_a = request.GET.get('id') #获取id id == 这个表里的自增id或all       api_dic={'type_t':type_t,'id_a':id_a}#把表名
        data_get = api_ojb.get(**api_dic)#调用api_class的get方法
        for i in data_get:     #循环拿到的字典可能是多个(在id=all的时候)   
            datalis1.append(i)
        datalist2 = json.dumps(datalis1).encode('utf-8')#格式化
        return HttpResponse(datalis1)
        #这个参数如果不是dumps后的中文不出现异常,如果是dumps过的会
         #出现\\u674e\\u56d
        
    else:
        data= json.loads(request.body.decode('utf-8'))
        #一个字典,要添加或要修改的的数据
         type_c = data["type_c"] #获取请求类型post或put
        post_dic = data
        if type_c == 'post':
            ret_post = api_ojb.post(**post_dic) 
            #调用didaapi.api_class的方法,把要添加的数据传给方法,获取返回结果
            return HttpResponse(ret_post)
        if type_c == 'put':
            data= json.loads(request.body.decode('utf-8'))
            get_dic = data
            ret_put = api_ojb.put(**get_dic)
            #调用didaapi.api_class的方法,把要添加的数据传给方法,获取返回结果
            return HttpResponse(ret_put)

四、settings.py修改

修改DATABASES 
DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',注释掉
        'ENGINE': 'django.db.backends.mysql',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 注释掉
        'NAME': 'didapinche_manifest',
        'HOST': 'ip地址',
        'PORT': '4000',#端口
        'USER': 'aaa',#用户
        'PASSWORD': 'aaa',#密码
    }
}
修改ALLOWED_HOSTS 
ALLOWED_HOSTS = ['*']

注册app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',#其他的不动这个是自己创建的app名称
]

五、model.py 表结构

from django.db import models


class Ipsource(models.Model):
    '''IP资源表'''
    area_choices = (
        (0,'测试环境'),
        (1,'仿真环境'),
        (2,'线上环境'),
        (3,'其他')
    )
    area = models.SmallIntegerField(u'环境',choices=area_choices,default=0)
    ip_address = models.GenericIPAddressField(u'IP地址',blank=True,null=True)
    netmask = models.GenericIPAddressField(u'子网掩码',blank=True,null=True)
    prefix = models.CharField(max_length=32,blank=True,null=True)
    network = models.CharField(max_length=32,blank=True,null=True)
    gateway_add = models.GenericIPAddressField(blank=True,null=True)
    state = models.CharField('状态',max_length=32,blank=True,null=True)
    asset_admin = models.CharField('资产管理员',max_length=64,blank=True,null=True)
    def __str__(self):
        return "Ipaddress:%s" %self.ip_address
    class Meta:
        verbose_name = "IP资源"
        verbose_name_plural = "IP资源"

class Server(models.Model):
    '''服务器信息'''
    asset_nb = models.CharField(u'资产编号',max_length=32,blank=True,null=True)
    area_choices = (
        (0,'测试环境'),
        (1,'仿真环境'),
        (2,'线上环境'),
        (3,'其他')
    )
    area = models.SmallIntegerField(u'环境',choices=area_choices,default=0)
    sub_assset_type_choices = (
        (0, "PC服务器"),
        (1, "刀片机"),
        (2, "小型机"),
    )
    ip_y = models.ForeignKey('Ipsource',blank=True,null=True,verbose_name="IP地址")
    ip_n = models.GenericIPAddressField(u"内网ip",blank=True,null=True)
    sn = models.CharField(max_length=64,blank=True,null=True)
    sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices, verbose_name="服务器类型", default=0)
    raid_type = models.CharField(u"raid类型",max_length=512, blank=True,null=True)
    os_type_choices = (
        (0,'Centos6.8'),
        (1,'Server2012'),
    )
    server_name = models.CharField(max_length=32,blank=True,null=True)
    os_type = models.SmallIntegerField(u"操作系统",choices=os_type_choices,default=0)
    os_mem = models.CharField(u"内存",max_length=64,blank=True,null=True)
    os_disk = models.CharField(u"硬盘",max_length=64,blank=True,null=True)
    os_cpu = models.CharField(u"CPU",max_length=64,blank=True,null=True)
    os_state_choices = (
        (0,'正常'),
        (1,'故障'),
        (2,'维修'),
        (3,'报废'),
    )
    sys_state = models.SmallIntegerField(choices=os_state_choices,default=0)
    frame = models.CharField(u"机架位",max_length=32)
    frame_u = models.CharField(u"U位",max_length=32)
    purchase_date = models.CharField(u"购买日期",max_length=32)
    purchase_people = models.CharField(u"购买人",max_length=32)
    purchase_source = models.CharField(u"server来源",max_length=32)
    money = models.IntegerField(u'人民币')
    guarantee = models.CharField(u"保修期",max_length=32)
    asset_admin = models.CharField('资产管理员',max_length=64,blank=True,null=True)
    def __str__(self):
        return "server_name:%s" % (self.server_name)
    class Meta:
        verbose_name = "服务器"
        verbose_name_plural = "服务器"

class Business(models.Model):
    '''
    业务表--服务器id
    '''

    username = models.CharField(u"用户",max_length=32,blank=True,null=True)
    hostname = models.ForeignKey('Server',blank=True,null=True)
    server_p = models.CharField(u'进程',max_length=32,blank=True,null=True)
    service = models.CharField(u"服务",max_length=64,blank=True,null=True)
    remarks = models.TextField(u"备注",max_length=128,blank=True,null=True)

    def __str__(self):
        return "业务id:%s" % (self.id)
    class Meta:
        verbose_name = "业务表"
        verbose_name_plural = "业务表"

class Repair(models.Model):
    '''维修表'''
    repair_type_choices = (
        (0,"Server"),
        (1,"Pc"),
        (2,"Mobiledevice"),
        (3,"ITequipment"),
    )
    repair_type = models.SmallIntegerField(u"类型",choices=repair_type_choices,default=0)
    type_id = models.IntegerField()
    message = models.TextField(max_length=128,blank=True,null=True)
    repairer = models.CharField('维修者',max_length=32,blank=True,null=True)
    repair_date = models.CharField(u"维修日期",max_length=32)
    os_state_choices = (
        (0,"已维修"),
        (1,"正在维修"),
    )
    sys_state = models.SmallIntegerField(choices=os_state_choices,default=0)
    class Meta:
        verbose_name = "维修表"
        verbose_name_plural = "维修表"
    def __str__(self):
        return "维修表id:%s"%self.id

class Pc(models.Model):
    '''员工PC'''
    asset_nb = models.CharField(u'资产编号',max_length=32,blank=True,null=True)
    pc_type_choices = (
        (0,"台式机"),
        (1,"笔记本"),
    )
    pc_type = models.SmallIntegerField(u"类型",choices=pc_type_choices,default=0)
    pc_sys_choices = (
        (0,"windows"),
        (1,"linux"),
    )
    pc_sys = models.SmallIntegerField(u"系统",choices=pc_sys_choices,default=0)
    cpu = models.CharField(max_length=32,blank=True,null=True)
    mem = models.CharField(u"内存",max_length=64,blank=True,null=True)
    disk = models.CharField(u"硬盘",max_length=64,blank=True,null=True)
    os_state_choices = (
        (0,"正常"),
        (1,"故障"),
        (2,"维修"),
        (3,"报废"),
    )
    sys_state = models.SmallIntegerField(choices=os_state_choices,default=0)
    purchase_date = models.CharField(u"购买日期",max_length=32)
    purchase_people = models.CharField(u"购买人",max_length=32)
    purchase_source = models.CharField(u"Pc来源",max_length=32)
    money = models.IntegerField(u"人民币")
    guarantee = models.CharField(u"保修期",max_length=32)
    asset_admin = models.CharField("资产管理员",max_length=64,blank=True,null=True)
    def __str__(self):
        return "Pc_id:%s" %self.id

    class Meta:
        verbose_name = "员工Pc"
        verbose_name_plural = "员工Pc"

class Mobiledevice(models.Model):
    '''移动设备'''
    mobiledevice_type_choices = (
        (0,"Android"),
        (1,"iphone")
    )
    mobiledevice_type = models.SmallIntegerField(choices=mobiledevice_type_choices,default=0)
    os_state_choices = (
        (0,"正常"),
        (1,"故障"),
        (2,"维修"),
        (3,"报废"),
    )
    sys_state = models.SmallIntegerField(choices=os_state_choices,default=0)
    purchase_date = models.CharField(u"购买日期",max_length=32)
    purchase_people = models.CharField(u"购买人",max_length=32)
    purchase_source = models.CharField(u"设备来源",max_length=32)
    money = models.IntegerField(u"人民币")
    guarantee = models.CharField(u"保修期",max_length=32)
    asset_admin = models.CharField("资产管理员",max_length=64,blank=True,null=True)
    class Meta:
        verbose_name = "移动设备"
        verbose_name_plural = "移动设备"
    def __str__(self):
        return "设备id:%s" %self.id

class ITequipment(models.Model):
    '''
    通用IT设备
    '''
    name = models.CharField(u"设备名称",max_length=64,blank=True,null=True)
    os_state_choices = (
        (0,"正常"),
        (1,"故障"),
        (2,"维修"),
        (3,"报废"),
    )
    sys_state = models.SmallIntegerField(choices=os_state_choices,default=0)
    purchase_date = models.CharField(u"购买日期",max_length=32)
    purchase_people = models.CharField(u"购买人",max_length=32)
    purchase_source = models.CharField(u"IT设备来源",max_length=32)
    money = models.IntegerField(u"人民币")
    asset_admin = models.CharField("资产管理员",max_length=64,blank=True,null=True)
    class Meta:
        verbose_name = "通用IT设备"
        verbose_name_plural = "通用IT设备"
    def __str__(self):
        return "IT设备id:%s" %self.id

通过在项目目录下,执行python manage makemigrations  和python manage migrate创建表


六、注册admin.py

from django.contrib import admin

# Register your models here.

from app import models#导入app下的moudel


admin.site.register(models.Ipsource)
admin.site.register(models.Server)
admin.site.register(models.Business)
admin.site.register(models.Pc)
admin.site.register(models.Mobiledevice)
admin.site.register(models.ITequipment)
admin.site.register(models.Repair)
#这些都是表名

在项目目录下创建超级用户 python manage.py createsuperuser  


七、运行django

        在项目目录下 python manage.py runserver 192.168.1.1:8000

访问 http://192.168.1.1:8000/admin 登陆django用户名密码是第六步创建的

八、例子

例子:GET
import json,requests
url = 'http://192.168.1.1:8000/dida_api/?type_t=Server&id=all'#两个参数type_t = 表的名字 ,id = all或者自增id号
r = requests.get(url)
r2 = r._content.decode('utf-8')
print(r2,type(r2))
 
例子:POST
import json,requests
data = {"netmask": "255.255.255.0","state": "aa", "type_c":"post",
        "gateway_add": "1.1.1.1", "ip_address": "1.1.1.3","type_t":"Ipsource",
        "network": "1.1.1.1", "asset_admin": "张奎奎",
        "prefix": "aa", "area": "2"}
#不需要id,type=表名,type_c=请求方式(post或者put)
data = json.dumps(data)#需要dumps一下
url = 'http://192.168.1.1:8000/dida_api/'
r = requests.post(url,data=data)
print(r._content.decode())#获取返回值
 
例子:PUT
import json,requests
data1 = {"purchase_people": "李四", "money": 666,'type_c':'put'
        , 'type_t':"Server",'id':1,"asset_admin": "李四",}
#需要指定id,type=表名,type_c=请求方式(post或者put)
data = json.dumps(data)#需要dumps一下
url = 'http://192.168.1.1:8000/dida_api/'
r = requests.post(url,data=data1)
print(r._content.decode())


菜鸟上路勿喷

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python3之api

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python3之api

刚到公司领导安排了一个任务,用Python写一个api接口        主要用到django,request,json,orm,HttpResponse        闲话少说上代码以下是表和需求:IP资源表:(IpSource)    
2023-01-31

python3之pymysql

pymsql是Python中操作MySQL的模块并且只有在Python3.0版本中才存在,其使用方法和MySQLdb几乎相同。下载安装pymsql模块pip3 install pymysql操作前准备#1.创建数据库mysql> creat
2023-01-31

使用python3调用 salt-api

使用python3调用 salt-api现在所有的操作还是基于命令行模式,在项目中我们不能使用命令行的模式去调用salt-api,所以我们可以写一个基于salt-api的类,方便项目代码的调用。在这里特别附上两种方式实现的python3版本
2023-01-31

python3之redis cluste

一、Redis 介绍Redis 是一个开源内存的数据存储系统,行业中用作高效数据库缓存较多。它支持多种类型的数据结构:strings:hashes,lists,sets,sorted sets, bitmaps,hyperloglogs ,
2023-01-31

python3之元组

python3之元组tuple特性:a. 元组是另一种有序的列表b. list非常相似,但是tuple一旦创建,就不能修改1.语法和list 类似,可以根据索引取值In [86]: t = ('wd','pc','lp','woniu')I
2023-01-31

python3学习之random

import randomprint(random.random()) #随机取值print(random.randint(1,4)) #随机从1到4去一个整数,包含1和4print(random.choice([1,2,3,4]))
2023-01-31

python3之类的 __slots__

1. 作用  1. 限定一个类创建的实例只能有固定的实例属性(实例变量),不允许对象添加列表以外的实例属性  2. 防止用户因错写属性名称而发生程序错误2. 说明  1. __slots__ 属性是一个列表,列表的值是字符串  2. 含有_
2023-01-31

python3之dict字典

字典字典是一种无序结构字典是一种kv结构value可以是任何对象key是唯一的key必须是可hash对象 字典初始化d = {}d = dict()d = {'a':1 , 'b':2} 字典的方法:1.     d.clear      
2023-01-31

Python3之cookie与sessi

会话技术的由来:由于http是无状态的,很多网站需要识别登录进来的用户身份,以备下次直接登录或者区分是哪个用户登录的,这样可以根据不同的用户展示不同的信息,这样就需要一种技术来保存用户的状态,这样会话技术应运而生!会话技术分为两种:浏览器端
2023-01-31

Python3之模块、包

一、模块1.模块的导入方式import random,time#导入多个模块#使用,如:random.randint(1,10)#使用,如:time.sleep(1)from random import randint#使用,如:randi
2023-01-31

python3学习之print

%[(name)][flags][width].[precision]typecode● (name)        可选,用于选择指定的key● flags            可选,可供选择的值有:    ●  +  右对齐    ●
2023-01-31

python3之list列表

list的用法(列表)1.list函数可以把字符串切割成listIn [2]: arr = list('python')In [3]: arrOut[3]: ['p', 'y', 't', 'h', 'o', 'n']2.遍历listIn 
2023-01-31

安装python3时,报错提示api-m

背景: 安装python3时会报错,提示api ms win crt runtime l1-1-0.dll 丢失解决办法 :一、安装两个补丁KB2×××26 微软下载链接 https://support.microsoft.com/en-u
2023-01-31

python3学习之列表

列表:L.append(object)   追加备注:append将obj作为一个整体追加,无论obj是字符串、数字、字典、列表等,当是字典时全部插入,跟L.extend(iterable) 不同test = [1,2,3,4,5]test
2023-01-31

python3之Splash怎么用

这篇文章主要为大家展示了“python3之Splash怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python3之Splash怎么用”这篇文章吧。Splash是一个javascript渲
2023-06-20

python3学习之元组

元组的值不能改变,有两个方法:T.count(value)  返回值是出现value的个数T.index(value, [start, [stop]]) 返回值是出现value的第一个index打印:for i in T:    print
2023-01-31

python3学习之正则

##正则表达式# . 任意一个# * 零及以上# ^  以某某开头# $  从某某结尾import re##s = "sdfjkslfjlkaaa1923891a"r = re.findall('^s.*a$',s)print(r)
2023-01-31

python3学习之对象

#过程编程----函数编程(代码复用高)--面向对象#python 支持  函数式+面向对象 编程# def mail(email,message):#     print("sendsend")#     return True## ma
2023-01-31

python3学习之反射

1、反射  用于方法调用利用字符串的形式去对象中操作成员(增/删/查),注意仅是在内存中操作#hasattr(模块,'字符串'): 判断有没有 ,模块中有没有“字符串”为名字的成员;  返还True或者False#getattr(模块,'字
2023-01-31

python3之发送邮件

#/usr/bin/env python3# encoding: utf-8#@author: Lejie#@software: PyCharm Community Edition#@file: learn_smtp.py#@time: 2
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录