zoukankan      html  css  js  c++  java
  • 接口开发(login、reg)

    接口开发:

    import flask,json,pymysql,hashlib
    
    server = flask.Flask(__name__)# 把当前这个python文件当做一个服务
    
    def my_db(sql,port=3306,charset='utf8'):
        ip,user,passwd,db = '***.**.**.*','jxz','123456','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=='123456':
            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':'1000','msg':'注册成功'}
                else:
                    res = {'code':'2003','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':'123456',
        '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
        如果第一次运行程序的时候,需要执行哪个文件
  • 相关阅读:
    LINQ进阶(深入理解C#)11 查询表达式和LINQ to Objects
    (转)Dinktopdf在.net core项目里将Html转成PDF(支持liunx)
    asp.net core 实现 face recognition 使用 tensorflowjs(源代码)
    fastreport-使用JSON做为数据源报表
    分享我的第一个RPA练习
    关于性能优化技巧
    Sql 增删改查语句
    将结果集插入另一个表中
    Vue+elementUI 表格 增删改查 纯前端 最终版
    【JAVA】使用IntelliJ IDEA创建 maven的quickStart项目
  • 原文地址:https://www.cnblogs.com/Noul/p/9341065.html
Copyright © 2011-2022 走看看