一、開發接口的作用:
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():取上一級目錄
這里完整的添加環境變量方法為:
添加之后,就可以直接用命令行啟動服務了。