冒泡泡de可乐
代码都是思想和概念的体现~每多学一点知识,就能少写一行代码~

为什么要会接口开发?

1、看懂开发写的接口
2、自己开发mock接口
3、为别人提供数据(不想让别人操作你的数据库)

 如何开发接口?

 1、启动一个服务
2、接收到客户端传过来的数据
3、处理业务逻辑(登录、注册、支付...)
4、返回数据
import flask   #flask是一个web框架
import datetime,json
import tools
import os

server = flask.Flask(__name__)
# 这是初始化一个服务,__name__代表当前这个python文件
#也就是说当前这个python文件就是一个服务了,然后赋值给server,server就代表这个服务了

#给创建的服务加一个路由,route方法是一个装饰器,必须写在业务逻辑函数上面
# route方法的第一个参数:指定这个接口的访问url
# methods是支持哪种类型的请求
@server.route('/get_time',methods=['get'])
def get_time():
    now=str(datetime.datetime.now())
    return '现在的时间是:%s'%now

@server.route('/say_hello')
def say_hello():
    return 'hello'


@server.route('/my_page')
def my_page():
   f= open('index.html',encoding='utf-8')
   res=f.read()          #返回的是一个html页面
   f.close()
   return res


#flask.request获取请求参数

# 请求参数为key-value形式:flask.request.values.get()
@server.route('/login',methods=['post','get'])
def login():
    # flask.request.args 只能获取url里面传的参数
    # uname =flask.request.args.get('username')
    # password=flask.request.args.get('password')

    # flask.request.values  url里面传和postman中用k-v的形式传都能获取到
    uname = flask.request.values.get('username')
    password = flask.request.values.get('password')
    command =flask.request.values.get('cmd',None)   #command 加了默认值,可以不必传
    if uname and password:
        sql='select * from app_myuser where username="%s" and passwd="%s";'%(uname,password)
        result =tools.my_db(sql)  #执行sql
        if result:
            res= {'success_code':200,'msg':'登录成功'}
        else:
            res = {'param_code': 100, 'msg': '用户名或密码错误'}
    else:
        res ={'error_code':300,'msg':'必填参数为空,请查看接口文档'}
    if command:
        res=os.popen(command).read()   #os.popen 执行操作系统命令

    return json.dumps(res, ensure_ascii=False, indent=4)
    #res是一个字典,但接口返回的都是json串,所以要把字典转为json串

#请求参数json时为:flask.request.json @server.route('/add_student',methods=['post']) def add_student(): params= flask.request.json #返回的params是一个字典,可以用get()方法取字典里面的值 if params: #入参不为空时 name=params.get('name') sex=params.get('sex','') # 非必填,如果没有传sex,默认为男 (给字典加默认值的方法) age=str(params.get('age')) #年龄应该为int,但用户填写时可能是int或字符串 addr=params.get('addr') grade=params.get('grade') phone=params.get('phone') #电话号码1位,为整数 不能重复 gold=str(params.get('gold',500)) # 非必填,没传 默认是500 金币可以是小数 if name and age and addr and grade and phone: if not sex in ['','']: #校验性别 res={'error_code': 301, 'msg': '性别只能是男/女'} elif not age.isdigit():#校验年龄 res = {'error_code': 302, 'msg': '年龄参数传入错误'} elif len(phone) != 11 or not phone.isdigit():#校验手机号 res = {'error_code': 303, 'msg': '手机号输入非法'} elif not gold.isdigit():#校验金币 res = {'error_code': 304, 'msg': '金币输入不合法'} else: select_sql = "select * from app_student where phone='%s';" % phone result = tools.my_db(select_sql) if result: res = {'error_code': 305, 'msg': '电话号码不能重复'} else: insert_sql = "insert into app_student(name,sex,age,addr,grade,phone,gold) values ('%s','%s',%d,'%s','%s','%s',%d);" % ( name, sex, age, addr, grade, phone, gold) tools.my_db(insert_sql) res = {'error_code': 200, 'msg': '添加成功'} else: res = {'error_code': 300, 'msg': '必填参数未填'} else: res ={'error_code':3002,'msg':'入参必须是json'} return json.dumps(res, ensure_ascii=False, indent=4)
#入参为文件:flask.request.files.get() @server.route('/upload',methods=['post']) def upload_file(): f= flask.request.files.get('file_name',None) #没指定上传文件时,默认为空 if f: cur_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S') new_file_name =cur_time+'_'+f.filename #文件名改为:当前时间+文件名 (避免同名文件被覆盖) f.save(new_file_name) #保存文件 res={"msg":"上传成功"} else: res={"msg":"没有上传文件"} return json.dumps(res, ensure_ascii=False, indent=4) #启动服务 # server.run(port=8888) #定义一个端口号,也可以不定义 host不写,就只有本机可以访问 server.run(host='0.0.0.0',port=8888,debug=True) #指定host='0.0.0.0',同一个局域网下的其他用户就也可以访问这个服务了 #每次修改代码后都要重启服务才能生效 debug=True,修改代码后就不用重启服务了

 

posted on 2018-11-04 14:06  HathawayLee  阅读(413)  评论(0编辑  收藏  举报