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():取上一級目錄

這里完整的添加環境變量方法為:

添加之后,就可以直接用命令行啟動服務了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM