Python-接口开发入门

一、开发接口的作用:

1、mock接口:模拟一些接口。有一些有关联的接口,在别的接口没有开发好的时候,需要用这个接口,就可以写一个假接口,返回想要的结果来模拟这个接口。

2、知道服务端的开发逻辑,有助于测试;

3、比如不想让其他人看很多数据库中的数据,可以通过接口只返回一部分数据。

二、开发一个接口

1、flask是一个轻量级的开发框架

__name__:代表当前这个python文件

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

2、一个无需传参数的get接口

其中,‘index’是接口的路径。

method如果不写,默认为get。如果需要支持多种,可以写成['get','post']

port是端口号,默认为5000。debug=True,这样改了代码之后,不需要重启服务,会自动重启。

先运行,然后用postman调用该接口,如下

可以看到,中文的编码之后的,想显示中文,按照下图方法即可

3、一个post接口

 开发一个注册接口,请求参数为:username和passwd。如果数据库中有该用户,就返回用户已存在。如果该用户不存在,就在数据库插入一条数据,返回注册成功。

下面的代码需要连接数据库,连接数据库部分省略了。

 

 为了让其他人也可以访问这个接口,可以用如下方法:

host=0.0.0.0表示只要在同一个局域网,别人访问的时候,用你的ip就可以访问了。ip指的是电脑的ip。
假如电脑的ip是10.2.88.122,那么别人电脑访问10.2.88.122:8999/reg即可。

三、开发接口目录

目录结构如下

主目录命名为my_api,可以根据实际情况命名

bin:可执行文件,即启动程序

config:配置文件

data:放置一些数据,如sql、入参等

lib:主逻辑

logs:log

readme:一些说明

我们把上面的代码分到各个目录里面

1、配置文件config-setting.py

存放一些常量,如数据库的信息,redis的信息,端口号等

 2、lib目录下tools.py

tools文件里写了怎么操作sql和redis

倒入setting里的信息,需要把my_api加到环境变量里。

在my_api文件夹上右击,选择mark directory as ->Source Root

导入setting

如果常量太多,则可以直接from config import setting

使用时,setting.MYSQL_INFO。用setting加点的方法。

 3、lib目录下interface.py

这里写接口的主逻辑

4、bin目录下start.py

 先从interface中导入server,从setting中导入端口号。

启动程序时,只需运行start.py即可

 四、有cookie,有依赖关系的接口开发

1、目录结构同上,其中操作tools.py如下

import redis,hashlib
# pycharm帮你加环境变量
# 在主目录  my_api单击右键,Mark dictionary as 选sources root
from config.setting import REDIS_INFO

def op_redis(k,v=None,time=None):
    r = redis.Redis(**REDIS_INFO)
    if v:
        r.set(k,v,time)
        res = 'ok'
    else:
        res = r.get(k)
        if res:
            res = res.decode()
    return res

def my_md5(s):
    md = hashlib.md5()
    md.update(s.encode())
    return md.hexdigest()

2、要求:(1)登录成功后,把cookie写入redis,其中key为 wind_session:username,value为session。  session生成规则是“username+当前时间(年月日时分秒格式)”组成的字符串进行md5加密(2)posts接口获取到要发表的文章的标题和内容,用session判断用户的登录状态,如果是登录状态,则文章可以发表,并写入redis。

分析:

(1)首先说登录接口,我们需要先生成session,然后存放到redis里。session按照要求,生成方式如下

写入redis直接调用tools里面的op_redis即可,过期时间这里是随便设置的6000s

还有一步就是cookie

完整的登录代码如下。这里主要是为了说明cookie,因此没有对登录进行复杂的校验。最后会有完整的代码和运行结果,如果看的云里雾里,可以先看下运行结果。

 (2)posts接口,需要获取到cookie,然后和redis中存的进行对比,如果一致,说明是登录状态,可以发表文章。

 获取cookie用下面的方法

我们可以打印出来,看一下cookie的格式,如下,是字典格式。因此取session时,按照字典取值的方法即可。

 

对我们有用的cookie是以wind_session为开头的,其他的cookie我们不用关注。因此我们只选出这部分,取出session值,和redis中对比。

步骤为:

A、if语句中,是我们取到的cookie,从中提取出用户名和session。

B、从redis中取出对应用户的session

C、两者对比

D、如果是登录状态,返回文章发表成功,并且把文章写入redis。

 

 (3)完整代码

interface.py:

import flask,time,json
from lib import tools
from config import setting

server = flask.Flask(__name__)

@server.route('/login')
def login():
    username = flask.request.values.get('username')
    pwd = flask.request.values.get('pwd')
    if username == 'wind' and pwd == '123456':
        session_id = tools.my_md5(username+time.strftime('%Y%m%d%H%M%S'))
        key = 'wind_session:%s'%username
        tools.op_redis(key,session_id,6000)
        res = {'session_id':session_id,'error_code':0,'msg':'登录成功','login_time':time.strftime('%Y%m%d%H%M%S')}#给用户返回的信息
        json_res = json.dumps(res,ensure_ascii=False)#返回结果为json格式
        res = flask.make_response(json_res)   #cookie 构造成返回结果的对象
        res.set_cookie(key,session_id,6000)#最后的数字是cookie的失效时间
        return res

@server.route('/posts')
def posts():

    print('all_cookies',flask.request.cookies) #字典形式
    cookies = flask.request.cookies #获取到所有的cookie
    username = '' #定义这两个变量是为了在没有传cookie时用的
    session = ''
    for cookie in cookies:
        if cookie.startswith('wind_session'): #判断cookie以syz_session开头的话,取到它
            username = cookie  #或者username = key   session = value
            session = cookies.get(cookie) #调用接口时,用户传的session
    redis_session = tools.op_redis(username) #从redis中获取的
    if redis_session == session:#判断传过来的session和redis中存的一样
        title = flask.request.values.get('title') #获取文章标题
        content = flask.request.values.get('content') #获取文章内容
        article_key = 'article:%s'%title #key以article开头
        tools.op_redis(article_key,content) #把文章写入redis
        res = {'msg':'文章发表成功!','code':0}
    else:
        res = {'msg':'用户未登录','code':2009}
    # print('username:',username)
    # print('session:',session)
    return json.dumps(res,ensure_ascii=False)

运行结果:

1、login接口

框起来的,是本次运行的cookie

redis里如下

2、posts接口

redis中

 五、配置环境变量的方法

以上接口开发时,我们调用自己写的方法,是通过先把new_api文件夹mark as source root。这样在pycharm运行是没问题的,但是如果我们把代码在其他设备上使用,或者直接用命令行启动,就会有问题。

直接在命令行运行如下,会发现很多模块是找不到的。

如果把new_api添加到环境变量,就可以运行。

方法一:直接把new_api的路径添加到环境变量,但是这种方法不灵活,一旦文件换了位置,或者换个设备,需要重新修改路径

方法二:自动获取路径,添加到环境变量

 __file__:获取当前路径,这个路径分隔符是“/”,不能直接添加到环境变量

 os.path.abspath(__file__):当前路径,分隔符是"\",可以直接添加到环境变量

os.path.dirname():取上一级目录

这里完整的添加环境变量方法为:

添加之后,就可以直接用命令行启动服务了。

 

posted @ 2019-07-31 17:48  wind1004  阅读(40887)  评论(4编辑  收藏  举报