首先安装第三方flask模块,pip install flaskpython
练习编写注册接口mysql
分析:git
1.注册须要有注册函数,最多输错3次,用户名不存在数据库,密码两次输入一致等redis
2.注册成功密码要加密,须要md5加密方法sql
3.注册成功后,存到数据库中数据库
import flask,json,hashlib,pymysql #读取数据库,sql是select为查询功能,insert则插入功能 def my_db(sql,port=3306,charset='utf8'): ip, user, password, db = '118.24.3.40','jxz','123456','jxz' conn = pymysql.connect(host=ip,user=user,password=password, db=db,port=port,charset=charset,autocommit=True) cur = conn.cursor() cur.execute(sql) sql = sql.strip() sql = sql[:6].lower()#取到执行语句的前6个字符,用来判断是select、show查询 仍是其余增删改(insert,delete,update) if sql.startswith('select') or sql.startswith('show'): data = cur.fetchall()#将查询的结果保存在data里 else: data = 'ok' cur.close() conn.close() return data #加密,返回加密后的字符串 def my_md5(s): m = hashlib.md5(s.encode()) return m.hexdigest() server = flask.Flask(__name__)#把这个当前python文件当作一个服务 @server.route('/register',methods=['post'])#@server.route装饰器,下面不是普通的函数 是一个接口 def reg(): username = flask.request.values.get('username')#入参为form-data形式 passwd = flask.request.values.get('passwd') cpasswd = flask.request.values.get('cpasswd') # json_data = flask.request.json # 获取入参是json类型的 # username = json_data.get('username') # passwd = json_data.get('passwd') # cpasswd = json_data.get('cpasswd') if not(username and passwd and cpasswd): res = {'code':'2003','msg':'缺乏必填参数'} else: sql1 = "select * from lina_users where username = '%s';"%username res = my_db(sql1) if res: res = {'code':'2001','msg':'该用户已被注册'} else: if passwd == cpasswd: res = {'code':'1000','msg':'注册成功'} sql = "insert into lina_users (username,password) VALUES ('%s','%s')"%(username, my_md5(passwd)) my_db(sql) else: res = {'code':'2002','msg':'两次密码不一致'} return json.dumps(res,ensure_ascii=False) #默认5000端口,127.0.0.1 IP、启动服务,host0.0.0.0 就能够使别人访问这个接口了 debug=TRUE就能够不用重启服务 server.run(host='0.0.0.0',port=8989,debug=True)
目录分层结构json
服务器bin目录放启动文件,conf下放配置文件,lib中放方法文件flask
因此提取文件中的启动程序,常量,函数,接口,分别放在bin,conf,lib目录下,经过import方式导入调用api
调用时,文件夹需在python的环境变量里,在pycharm中能够直接点击文件夹右键加入环境变量中服务器
文件分层以下:
setting.py程序以下:
#mysql配置信息 MYSQL_INFO = { 'host':'118.xx.3.40', 'port':3306, 'user':'jxz', 'password':'123456', 'db':'jxz', 'charset':'utf8', 'autocommit':True } #redis配置信息 REDIS_INFO = { 'host':'118.xx.3.40', 'port':6379, 'password':'HK139bc&*', 'db':9 } #服务接口 SERVER_PORT=8989 #redis失效时间 EXPIRE_TIME=24*3600
func.py程序
from conf.setting import MYSQL_INFO,REDIS_INFO,EXPIRE_TIME import pymysql,hashlib,redis #操做mysql def my_db(sql): conn = pymysql.connect(**MYSQL_INFO) cur = conn.cursor() cur.execute(sql) sql = sql.strip() sql = sql[:6].lower()#取到执行语句的前6个字符,用来判断是select、show查询 仍是其余增删改(insert,delete,update) if sql.startswith('select') or sql.startswith('show'): data = cur.fetchall()#将查询的结果保存在data里 else: data = 'ok' cur.close() conn.close() return data def my_md5(s): m = hashlib.md5(s.encode()) return m.hexdigest() #redis操做str类型 def op_str_redis(key, value=None): conn = redis.Redis(**REDIS_INFO) if value: conn.set(key,value)#传value,则插入或者修改key conn.expire(key,EXPIRE_TIME) return 'set操做成功' elif not conn.get(key): return '%s不存在'%key#没传value,且key不存在 else: res = conn.get(key).decode()#查询key对应的value值 return res #判断是否为正数 def check_float_int(s): if s.isdigit() and not s.startswith('0'): return True elif s.count('.') == 1: slist = s.split('.') left = slist[0] right = slist[1] if left.isdigit() and right.isdigit():#判断正小数的 return True else: return False
interfaces.py程序
import flask,json,time from lib.func import my_db,my_md5,op_str_redis,check_float_int # server = flask.Flask(__name__) @server.route('/login',methods=['get']) def login(): username = flask.request.values.get("username") password = flask.request.values.get("pwd") sql = "select password from lina_users where username = '%s'"%username res_pwd = my_db(sql) if not(username and password): res = {'code':'2001','msg':'必填参数未填,请查看接口文档'} elif not res_pwd: res = {'code': '2002', 'msg': '用户名不存在'} elif res_pwd[0][0] != my_md5(password): res = {'code': '2003', 'msg': '密码不正确'} else: id = username+str(int(time.time())) sessionid =my_md5(id) op_str_redis("session:%s"%username,sessionid) res = {'code': '1000', 'login_ info':{'msg': '登陆成功','sessionid':sessionid,'login_time':int(time.time())}} return json.dumps(res,ensure_ascii=False) @server.route('/pay',methods=['get','post']) def pay(): username = flask.request.values.get("username") payment = flask.request.values.get("payment") sessionid = flask.request.values.get("sessionid") key_res = 'session:%s'%username val_res = op_str_redis(key_res) if not(username and payment and sessionid): res = {'code': '2001', 'msg': '必填参数未填,请查看接口文档'} elif not check_float_int(payment): res = {'code': '2005', 'msg': '参数不合法'} else: res_db = my_db("select username,account from lina_account where username = '%s'"%username) if not res_db: res = {'code': '2002', 'msg': '用户不存在'} elif val_res==sessionid: remain = res_db[0][1]-float(payment) if remain>=0: res = {'code': '1000', 'msg': '付款成功','pay_time':int(time.time())} my_db("update lina_account set account = '%s' where username = '%s'"%(remain,username)) elif remain<0: res = {'code': '2003', 'msg': '余额不足'} else: res = {'code': '2004', 'msg': '用户未登陆'} return json.dumps(res, ensure_ascii=False) @server.route('/register',methods=['post']) def reg(): username = flask.request.values.get('username') passwd = flask.request.values.get('pwd') cpasswd = flask.request.values.get('cpwd') if not(username and passwd and cpasswd): res = {'code':'2003','msg':'缺乏必填参数'} else: sql1 = "select * from lina_users where username = '%s';"%username res = my_db(sql1) if res: res = {'code':'2001','msg':'该用户已被注册'} else: if passwd == cpasswd: res = {'code':'1000','msg':'注册成功','method':flask.request.method} sql = "insert into lina_users (username,password) VALUES ('%s','%s')"%(username, my_md5(passwd)) my_db(sql) else: res = {'code':'2002','msg':'两次密码不一致'} return json.dumps(res,ensure_ascii=False)
running.py函数
import sys,os base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取lina_api绝对路径 sys.path.insert(0,base_path)#加入到环境变量中,在任何路径或者系统都不会报错了 from lib.interfaces import server from conf.setting import SERVER_PORT server.run(port=SERVER_PORT,debug=True)