python web接口實(shí)現(xiàn)(restful方式、jsonrpc方式)

準(zhǔn)備把自己寫(xiě)的爛網(wǎng)站重構(gòu)一下,讓有些功能能接口分離。之前照著flask web開(kāi)發(fā)這本書(shū)的教程來(lái)時(shí),因?yàn)槭切率炙杂米詈?jiǎn)單的方式來(lái)實(shí)現(xiàn),當(dāng)時(shí)就不會(huì)去考慮前后端分離 !!!∑(?Д?ノ)ノ

現(xiàn)在JSON是大勢(shì)所趨的主流,所以我的前后端傳的都是JSON格式數(shù)據(jù)。

后端python: 使用的flask庫(kù)和第三方擴(kuò)展,以登錄頁(yè)面的登錄接口為例子,因?yàn)橹皇呛?jiǎn)單例子,所以不包含model部分,只做簡(jiǎn)單的邏輯處理。

前端的ajax: 我都用的是jquery實(shí)現(xiàn),所以需得導(dǎo)入 jquery

restful風(fēng)格的接口實(shí)現(xiàn)例子

1、前端ajax:

<script type="text/javascript">
$(function () {
    $('.btn').click(function () {
        var $email=$('input[name="email"]').val();
        var $password=$('input[name="password"]').val();
        $.ajax({
            url:'/api/login',
            data:JSON.stringify({'email':$email,'password':$password}),
            type:'POST',
            dataType:'json',
            contentType:'application/json',
        }).done(function (data) {
                 if (!data.r){
                    alert('ok');
                }
                else{
                    alert('error');
                }
            });
    });
});
</script>

對(duì)class為btn的buttun元素添加點(diǎn)擊事件,從而獲取輸入的賬號(hào)、密碼,再通過(guò)jquery的ajax方法發(fā)出json格式的請(qǐng)求,
最后通過(guò)done回調(diào)函數(shù)獲取返回的data,判斷返回的值來(lái)彈出提示。
note:發(fā)出的data,要通過(guò)json.stringify轉(zhuǎn)換為字符串

2、后端python實(shí)現(xiàn):

@app.route('/api/login',methods=['POST'])
def login():
    json=request.get_json()
    email=json.get('email')
    password=json.get('password')
    if email=='tang@163.com' and password=='tmhrush':
        return jsonify({'r':0,"rs":'ok'})
    else:
        return jsonify({'r':1,"rs":'is error'})

通過(guò)request.get_json獲取json請(qǐng)求,通過(guò)jsonify函數(shù)返回序列化為json的數(shù)據(jù)

jsonrpc接口的實(shí)現(xiàn)例子:

1、前端ajax,

只需要把請(qǐng)求的data參數(shù)內(nèi)容done回調(diào)函數(shù)的內(nèi)容改為jsonrpc規(guī)范的格式就可以了
例如:
data內(nèi)容:

data:JSON.stringify({"jsonrpc": "2.0", "method": "login", "params": {'email':$email,'password':$password} , "id": 1})

回調(diào)函數(shù)done內(nèi)容:

done(function (data) {
                 if ('reuslt' in data ){
                    alert('ok');
               }
                else{
                    alert('error');
                }
            });

2、后端python實(shí)現(xiàn):

用的flask_jsonrpc第三方擴(kuò)展
其中有一個(gè)我覺(jué)得的小坑:
flask_jsonrpc 源碼中JSONRPC類(lèi)的構(gòu)造函數(shù)中參數(shù)app默認(rèn)為None,但同時(shí)其中有這段代碼

if app is not None:
    self.app = app
    self.init_app(self.app)
else:
    self.app = None

因?yàn)橐獙?shí)例化jsonrpc( JSONRPC類(lèi) )對(duì)象必須要傳入app(flask實(shí)例)參數(shù)
所以有不能在工廠函數(shù)create_app中實(shí)例 jsonrpc的問(wèn)題,單獨(dú)在 api.py頁(yè)面中實(shí)例

from flask_jsonrpc import JSONRPC
from flask import jsonify
from .manage import app

jsonrpc = JSONRPC(app, service_url='/api')

@jsonrpc.method('login')
def login ():
     json=request.get_json()
    email=json.get('email')
    password=json.get('password')
    if email=='tang@163.com' and password=='tmhrush':
        return {'r':0,"rs":'ok'}
    else:
        return {'r':1,"rs":'is error'}

通過(guò)jsonrpc.method建立視圖函數(shù)和URL接口的映射

from app.manage import manager

from app import api
#導(dǎo)入依賴模板

if __name__=='__main__':
    manager.run()

note:在主模塊中導(dǎo)入api模塊

3、總結(jié)

以上就是這兩種接口的實(shí)現(xiàn)方法。
在我看來(lái)jsonrpc方式雖然麻煩一下,但更適合做內(nèi)部程序的webapi接口,RPC協(xié)議使用二進(jìn)制編碼,流量消耗小網(wǎng)絡(luò)性能更好。而且RPC就像本地調(diào)用方法,添加接口很方便。

所以我覺(jué)得對(duì)外開(kāi)放的WEB接口適合用restful風(fēng)格;而內(nèi)部接口jsonrpc更適合,而且rpc規(guī)范中對(duì)異常錯(cuò)誤處理感覺(jué)很工程化

首發(fā)于我的個(gè)人網(wǎng)站文章,http://www.valkyrie233.com/post/3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,390評(píng)論 22 257
  • 想了很久想寫(xiě)點(diǎn)什么,現(xiàn)在的微信的微博似乎成了曬生活的一種方式。我想大多數(shù)的人常態(tài)莫過(guò)于一邊碌碌無(wú)為,一邊又羨慕著...
    等風(fēng)也等你oz閱讀 463評(píng)論 0 2
  • 最近在優(yōu)化項(xiàng)目雖說(shuō)小優(yōu)化一直在持續(xù),大版本的優(yōu)化也進(jìn)行了兩個(gè)版本了但是bug列表依舊血淋淋的擺在那里。有的看一眼也...
    初光夫閱讀 1,307評(píng)論 2 50
  • 第六章 1 感覺(jué)好久沒(méi)有去跳舞了,這些日子,從項(xiàng)目的忙碌中抽出身后,我便經(jīng)常和楊麗穎約會(huì),從當(dāng)初的陌生和羞澀,到今...
    田野虎閱讀 320評(píng)論 3 4

友情鏈接更多精彩內(nèi)容