day8—python——接口开发

import flask
import datetime
import json
import os

server=flask.Flask(__name__)#__name__为当前使用的py文件的名称,这条语句就是把当前这个py文件当做一个服务
@server.route('/xiaojun',methods=['post'])#每个接口是通过url来区分的,/后面的文字不用和函数名一一对应,methods=['post']说明这个接口的请求方式是什么,默认是get,不写就是默认值
def get_time():
now=str(datetime.datetime.now())
return "现在的时间是:%s"%now

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

@server.route('/index')
def my_page():
f=open('hh.html',encoding='utf-8') #html文件为同目录下的文件,也可以写绝对路径的,修改html文件后,不用重启python服务,刷新浏览器就是重启访问接口,也就是重新访问html文件,所以不用重启py文件
res=f.read()
f.close()
return res


@server.route('/login',methods=['post'])#也可以写成methods=['post'],['get'],就是两个请求都可以
def login():
uname=flask.request.values.get('username')#get后面的值一定要和接口传入的key一致,比如get方式就要和浏览器问号后面的key一致
passwd=flask.request.values.get('password')
#args这个方法只能获取到url里传的参数,如果上面写uname=flask.request.args.get('username'),那么在postman里不能写到下方key-value处,要写到上方url处按照get方法写url,否则会提示没有输入内容
#values这个方法,不管在url还是k-v传的参数,都可以获取到
command = flask.request.values.get('cmd',None)#为参数值为None时,为不必传,这条为留后门语句,如果不填cmd这个参数,就会对原来代码没有影响,就不会走下面 if command语句
if uname and passwd:
sql="select username,passwd from app_myuser where username='%s'and passwd='%s';"%(uname,passwd)
result=tools.my_db(sql)#执行sql,调用tools模块里的函数
if result:
res= {"error_code":1000,"msg":"成功"}
# res= "{"error_code":1000,"msg":"成功"}" #直接加引号也可以转成字符串,但是还是用下面的方法转成json比较好
else:
res={"error_code":3001,"msg":"错误"}
else:
res = {"error_code": 3000, "msg": "空"}
if command:
res=os.popen(command).read()
return res
return json.dumps(res, ensure_ascii=False)#indent在浏览器里不起作用


@server.route('/add_student',methods=['post'])
def add_student():
params=flask.request.json #入参是字典时用这个方法
if params:#比如先判断入参是否为空,因为flask.request.json的值必须为字典,如果为比如k-v形式的,就会返回为None,而None是没有.get方法的,就会报错,只有字典才有.get方法
name=params.get('name')
sex=params.get('sex','男')#男为默认值,即如果没填,默认为男
age=str(params.get('age'))#为了校验age是否为数字,要用到字符串里.isdigit方法,所以先强制转为str类型
addr=params.get('addr')
grade=params.get('grade')
phone=str(params.get('phone'))
gold=str(params.get('gold',500))
if name and age and addr and grade and phone:
if sex not in ['男','女']:
res = {"error_code": 3003, "msg": "性别错误"}
elif not age.isdigit():
res = {"error_code": 3003, "msg": "年龄错误"}
elif len(phone)!=11 or not phone.isdigit():
res = {"error_code": 3003, "msg": "手机输入非法"}
elif not gold.isdigit() and not tools.check_float(gold) :#python and or用法 or:当有一个条件为真时,该条件即为真;and:当所有条件为真时,该条件即为真。
res = {"error_code": 3003, "msg": "金币不合法"}
else:
sql="select * from app_student where phone='%s;'"%phone
result=tools.my_db(sql)
if result:
res={"error_code": 3004, "msg": "手机号已存在"}
else:
sql = "INSERT INTO app_student(NAME,sex,age,addr,grade,phone,gold)VALUES('%s','%s',%s,'%s','%s',%s,'%s')" % (
name, sex, age, addr, grade, phone, gold)
tools.my_db(sql)
res={"error_code": 200, "msg": "新增成功"}
else:
res={"error_code":3002,"msg":"入参必须是json"}
return json.dumps(res,ensure_ascii=False)


@server.route('/file_upload',methods=['post'])
def file_upload():
f=flask.request.files.get('wjm',None)
if f:
cur_time=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
new_file_name=cur_time+f.filename #f.filename获取文件名的方法
f.save(new_file_name)#保存文件,此为当前目录的绝对路径,可以写其他地方的路径
res = {"msg": "上传ok"}

else:
res={"msg":"没有上传"}
return json.dumps(res, ensure_ascii=False)

server.run(host='0.0.0.0',port=8888,debug=True)#默认端口号是5000,可以不写,写上host='0.0.0.0'后,本局域网的用户都可以访问,debug=True加上后,修改代码自动重启,不用手动重启了
#server.run这行代码必须写在最后一行
posted @ 2018-11-04 22:47  apollecn  阅读(145)  评论(0编辑  收藏  举报