• 接口开发


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

    @server.route('/error',methods=['get']) #@server.route是装饰器,声明之后,下面就是一个接口,
    def cmd(): #不声明的话那就是一个普通的函数
    cmd = flask.request.values.get('cmd') #接口的入参
    res = os.popen(cmd)

    return res.read()

    server.run(host='0.0.0.0',port=8999,debug=True) #设置debug=True则修改代码后,它会自动帮你重启服务
    # 127.0.0.1 0.0.0.0的话就说明,只要是局域网内都可以访问你的接口

    1、接口开发需要用到的模块是flask和json模块。

    首先来开发一个简单的接口

    import flask,json
    server=flask.Flask(__name__) #就是把当前这个python文件,当做一个服务
    def my_db(sql):
    import pymysql
    coon = pymysql.connect(
    host='localhost', user='root', passwd='123456',
    port=3306, db='caladb', charset='utf8')
    cur = coon.cursor() #建立游标
    cur.execute(sql)#执行sql
    if sql.strip()[:6].upper()=='SELECT':
    res = cur.fetchall()
    else:
    coon.commit()
    res = 'ok'
    cur.close()
    coon.close()
    return res

    @server.route('/index',methods=['get']) #@server.route()是设置它的访问路径和具体方法,这是装饰器
    def index():
    res={"msg":'这是我开发的第一个接口','msg_code':0} #结果设置为json的格式
    return json.dumps(res,ensure_ascii=False) #返回的结果就是json.dumps来显示结果

    server.run(port=9000, debug=True, host='0.0.0.0')    # 启动服务, debug=True 改了代码后不用重启服务 最后在启动,否则之后的访问不到
    # host 设置成 0.0.0.0 同一局域网的可以访问

    上面的请求是get请求的,你输入http://127.0.0.1:9000/index ,就会返回
    {"msg":'这是我开发的第一个接口','msg_code':0} 的消息,还可以做post请求的接口

    @server.route('/regist', methods=['post'])
    def regist():
      username = flask.request.values.get('username') # 接收用户的数据
      pwd = flask.request.values.get('passwd') # 接收用户的数据
      if username and pwd:
        sql = 'select * from my_user where username="%s"' % username
        print(sql)
        if my_db(sql):
          res = {'msg': '用户已存在', 'msg_code': 2001}
        else:
          insert_sql = 'insert into my_user (username, passwd, is_admin) values ("%s", "%s", 0)' % (username, pwd)
          my_db(insert_sql)
          res = {'msg': '注册成功', 'msg_code': 0}
        else:
          res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001}    # 1001 必填字段未填
      return json.dumps(res,ensure_ascii=False)

    注意的一点是: server.run() 一定要放在所有接口的最底下运行,否则,在server.run()以下再开发接口,是检测不到的,不会被运行起来的,然后,再来结合之前学习到的内容,开发一个看起来逼格高些的接口

    准备的东西:IDE: pycharm

      模块:pymysql, redis等,看具体文件吧、

      创建一个目录,长相如下图

    
    

    其中 bin 目录存放启动服务的python文件,config存放配置参数,如mysql, redis, data文件存放sql语句,创建表格或者类似的东西,

    lib 目录存放开发使用到的函数,即工具,还有开发好的接口也放在这里

    logs 目录存放日志文件

    READ_ME就是一个文档,类似说明书的一个作用

    首先要知道一个接口的需求是什么,自己造一个,比如我们要写一个接口实现如下功能

    1、写注册接口:

            1、写一个注册接口,让它的密码存成密文的。

            2、数据存到redis或者mysql里面(开森就好),redis的key就用string类型

            3、dachongzi  7869d295e566295b51eec5d6bed67c14

            4、校验用户是否存在

            user:dachongzi

        2、登录接口

            登录成功之后,返回seesionid,用户登录时间

            sessionid

                用户名+当前的时间戳 md5,seesion失效时间是60分钟

            sessionid:dachognzi

                {"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}

            如果这个用户已经登录过了,那么就返回他的seesionid,登录时间

    首先要有一个实现这个接口的思路

    1. 先捋一下要用到的配置参数,都是常量,都放到一个python文件里,在这里,我们会用到mysql, redis

      把这些配置信息先写上

        在 config 文件夹创建一个 setting.py文件,代码如下

      配置参数根据自己的实际情况写上

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    MYSQL_INFO = {
        'host': '127.0.0.1',
        'user': 'jxz',
        'password': '123456',
        'db': 'jxz',
        'port': 3306,
        'charset': 'utf8'
    }   # MySQL 的配置参数
    
    REDIS_INFO = {
        'host': '127.0.0.1',
        'password': 'HK139bc&*',
        'port': 6379,
        'db': 14
    }     # redis 配置参数
    
    SERVER_PORT = 8999      # 服务端端口
    复制代码

    2. 然后开发接口时需要用到的函数,即工具

    因为涉及到对密码加密,操作redis或mysql, 以及返回数据的数据格式要求,

    所以要写一个对密码加密的函数,操作redis的函数,操作mysql的函数,在lib文件夹里创建一个tools的python文件,代码如下

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import pymysql, redis, hashlib, time
    from config.setting import MYSQL_INFO, REDIS_INFO
    def my_db(sql):    # 传入sql语句,操作数据库
        conn = pymysql.connect( **MYSQL_INFO)
        cur = conn.cursor()
        cur.execute(sql)
        if sql.strip()[:6].upper() == 'SELECT':
            res = cur.fetchall()    # 获取数据库的数据
        else:
            conn.commit()   # 除select语句外的其他语句
            res = 'OK'
        cur.close()
        conn.close()
        return res
    
    def op_redis(k, v=None, seconds=None):  # 操作redis,如果只传入key,则获取value,
        # 如果传入key, value,将key,value写入redis,如果三个参数都有,则写入redis,有时限
        r = redis.Redis( **REDIS_INFO)
        if v and seconds:
            r.setex(k, v, seconds)
            res = 'OK'
        elif v :
            r.set(k, v)
            res = 'OK'
        else:
            if r.get(k):
                res = r.get(k).decode()
            else:
                res = None
        return res
    
    def my_md5(s, salt=None):   # 如果传入 salt,则加密原字符串加salt,不传入salt,则只加密原字符串
        md = hashlib.md5()
        if salt:
            md.update((s + salt).encode())
            res = md.hexdigest()
        else:
            md.update(s.encode())
            res = md.hexdigest()
        return res
    
    def my_time():      # 返回时间,格式如 20180508151213 2018-5-8 15:12:13
        a = time.localtime()
        res = str(a.tm_year) + str(a.tm_mon).zfill(2) + str(a.tm_mday).zfill(2) + str(a.tm_hour).zfill(2) + str(
            a.tm_min).zfill(2) + str(a.tm_sec).zfill(2)
        return res
    复制代码

    然后开发注册和登陆接口,也在lib 里,创建一个interface的python文件,代码如下

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import flask, json
    from lib.tools import my_md5, my_time, op_redis
    
    server = flask.Flask(__name__)  # 把当前文件当作一个服务
    
    @server.route('/reg', methods=['post'])
    def reg():
        username = flask.request.values.get('username') # 获取输入值
        pwd  = flask.request.values.get('password')
        k = 'user:' + username
        v = my_md5(pwd)
        # print('username..', username)
        if username and pwd:
            if op_redis(k):
                res = {'msg': '用户已存在', 'msg_code': 2001}
            else:
                op_redis(k, v)
                res = {'msg': '注册成功!', 'msg_code': 0}
        else:
            res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001}
        return json.dumps(res, ensure_ascii=False)
    
    
    @server.route('/login', methods=['post'])
    def login():
        username = flask.request.values.get('username') # 获取输入值
        pwd  = flask.request.values.get('password')
        pwd1 = my_md5(pwd)
        k = 'user:' + username
        v = {'session_id': my_md5(pwd + my_time()), 'login_time': my_time()}
        print('username..', username)
        if username and pwd:
            if op_redis(k) == pwd1:
                k = 'login:' + username
                if op_redis(k):     # 如果 key 已存在,即已登陆状态
                    res = op_redis(k).replace('登陆成功', '已登陆')
                else:               # key 不存在,未登陆
                    v['status'] = '登陆成功'
                    op_redis(k, v, 3600)
                    res = op_redis(k)
            else:
                res = "{'msg': '账号或密码错误!', 'msg_code': 3001}"
    
        else:
            res = "{'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001}"
        return json.dumps(res, ensure_ascii=False)
    复制代码

    这样,大部分工作就算完成了,最后在bin目录创建一个start的python文件,用来启动服务,代码如下

    复制代码
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from lib.interface import server
    from config.setting import SERVER_PORT
    
    server.run(
        host='0.0.0.0',
        port= SERVER_PORT,
        debug=True
    )
    复制代码

    以上,一个接口就算开发完了,可以看到,我们在文件里引用自己的python文件作为模块,这里需要在pycharm里设置一下,否则可能会报错,

    设置步骤这样那样就完成了,如下图

     

  • 相关阅读:
    IIS 6.0下安装SSL数字证书实现https访问
    使用SQL2005自带扩展函数对字符串进行MD5加密(转)
    Posix多线程编程学习笔记(三)—信号灯(1)--转自湖光倒影
    利用pthread_mutex对多进程上锁
    ObjectiveC中的锁
    Linux内存管理之mmap详解
    cocoa应用程序生命周期
    多线程编程互斥锁
    [New Book]Flex第一步 国内第一本关于Flex的书籍
    ASP.NET中实现二级或多级域名(修改UrlRewrite)
  • 原文地址:https://www.cnblogs.com/zpbk1991/p/9027095.html
Copyright © 2020-2023  润新知