flask-restful


 

  • GET :請求從服務器獲取特定資源。舉個例子:GET /classs(獲取所有班級)
  • POST :在服務器上創建一個新的資源。舉個例子:POST /classs(創建班級)
  • PUT :更新服務器上的資源(客戶端提供更新后的整個資源)。舉個例子:PUT /classs/12(更新編號為 12 的班級)
  • DELETE :從服務器刪除特定的資源。舉個例子:DELETE /classs/12(刪除編號為 12 的班級)
  • PATCH :更新服務器上的資源(客戶端提供更改的屬性,可以看做作是部分更新),使用的比較少,這里就不舉例子了

 

 

講restful的:https://mp.weixin.qq.com/s/10oSdNPwBDi_yXExt0uDMg

版本:https://developer.github.com/v3/, 有的將版本放在head里
參數規范:下划線命名
url規范:url中不能有動詞,只能有名詞,且是名詞復數
對於參數特別多的,路由可以寫成:[Route(“api/orders/{address}/{month}”)],
如:https://example.com/api/orders/beijing/6?order_amount_greater=500&sort=order_amount_desc
返回格式:json 或 xml

 

==================

https://www.cnblogs.com/sss4/p/8097653.html

https://www.cnblogs.com/Sunzz/category/1474541.html

https://www.cnblogs.com/kaituorensheng/p/4645080.html

https://www.cnblogs.com/pyspark/p/8677750.html

 restful api 最佳實踐 http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

=====================

RESTful API就是基於HTTP協議對互聯網的內容定義的方式提出的一套互聯網應用的架構體系,其中信息以JSON的形式進行存儲,對對象的資源、操作、狀態
進行定義,RESTful是一種設計模式規范的指南,不是強制性的要求,所以要靠開發者自己遵守

URL基本要求

1.協議:HTTP或HTTPS
2.域名和地址一般格式:http://<域名>/api/<version>
3.域名和地址之后接資源名字統一用復數

DELETE www.baidu.com/api/v1/articles?author=1&category=2      # 標准的restful api 示例
# 動詞 DELETE,表示要進行的操作是刪除,即狀態轉移
# 賓語 articles,表示文章這種資源URI,推薦用復數,即表現層
# 定語 author=1&category=2,表示具體是什么資源
# 版本 api/v1,這個能夠幫助我們更好的進行版本的升級,同時不影響原有的請求

 restful api的特點:

無狀態
請求URL = 動作(GET/POST/PUT/DELETE)+ 資源
響應使用精確的狀態碼和JSON格式數據

 

寫RESTful API步驟

1.想清楚我們的應用里可以抽象出什么樣的資源,和他們的層次結構
2.想清楚對對象的基本操作:GET,POST,PUT,DELETE的含義是什么
3.組織接口代碼。Spring如何去定義這些路由(URL):URL->Java類方法
4.開始實現



作者:迷路的丸子
鏈接: https://www.jianshu.com/p/846bb2c9098e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

======================

RESTful API返回的不是HTML,而是機器能直接解析的數據
隨着ajax的流行,API返回數據,而不是HTML頁面,數據交互量減少,用戶體驗會好。
前后台分離,后台更多的進行數據處理,前台對數據進行渲染。

如果在普通的網站中,這個插件就顯得有些雞肋了,因為在普通的網頁開發中,是需要去渲染HTML代碼的,而Flask-Restful在每個請求中都是返回json格式的數據。

@app.route('/post/<path:path>')

# 接收URL鏈接類型參數
app=Flask(__name__)
@app.route('/<path:url>/')  #設置url傳參數:http://127.0.0.1:5000/http://www.baiu.com/
def first_flask(url):  #視圖必須有對應接收參數
    print(url)
    return 'Hello World'  #response

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

接收URL鏈接類型參數

注意如果要給視圖函數加裝飾器增加新功能,一點要加在路由裝飾器下面

設置cookie和響應頭

response = make_response(render_template('index.html'))

response是flask.wrappers.Response類型

response.delete_cookie('key')

response.set_cookie('key', 'value')

response.headers['X-Something'] = 'A value'

return respons

Flask使用的是Jinja2模板,所以其語法和Django無差別(Django的模板語言參考Jinja2)

1.@app.before_first_request :請求第1次到來執行1次,之后都不執行;

2.@app.before_request:請求到達視圖之前執行;(改函數不能有返回值,否則直接在當前返回)

3.@app.after_request:請求 經過視圖之后執行;(最下面的先執行)

request.method: 獲取請求方法

request.json

request.json.get("json_key"):獲取json數據 **較常用      

request.argsget('name') :獲取get請求參數   

request.form.get('name') :獲取POST請求參數

request.form.getlist('name_list'):獲取POST請求參數列表(多個)

request.values.get('age') :獲取GET和POST請求攜帶的所有參數(GET/POST通用)

request.cookies.get('name'):獲取cookies信息

request.headers.get('Host'):獲取請求頭相關信息

request.path:獲取用戶訪問的url地址,例如(/,/login/,/ index/);

request.full_path:獲取用戶訪問的完整url地址+參數 例如(/login/?age=18)

request.script_root: 抱歉,暫未理解其含義;

request.url:獲取訪問url地址,例如http://127.0.0.1:5000/?age=18;

request.base_url:獲取訪問url地址,例如 http://127.0.0.1:5000/;

request.url_root

request.host_url

request.host:獲取主機地址

request.files:獲取用戶上傳的文件
 # 獲取一個參數的一個值
    http://127.0.0.1:5000/request?username=abcd
    username = request.args.get("username")
    # print(username)
    """打印效果: abcd  """

    # 獲取一個參數的多個值
    # http://127.0.0.1:5000/request?username=xiaoming&love=吹牛&love=睡覺
    love = request.args.getlist("love")
    # print(love)
    """打印效果: ['吹牛', '睡覺']"""


    # 把傳遞過來的數據抓換成原生的字典
    data = request.args.to_dict()
    # print(data)
    """打印效果:{'username': 'xiaoming', 'love': '吹牛'} """
在 Flask 中可以直接使用 jsonify 生成一個 JSON 的響應
from flask import Flask, request, jsonify

@app.route("/")
def index():
    # 也可以響應json格式代碼
    data = [
        {"id":1,"username":"liulaoshi","age":18},
        {"id":2,"username":"liulaoshi","age":17},
        {"id":3,"username":"liulaoshi","age":16},
        {"id":4,"username":"liulaoshi","age":15},
    ]
    return jsonify(data)
Cookie基於域名安全,不同域名的Cookie是不能互相訪問的

如訪問luffy.com時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,無法訪問到luffy.com寫的Cookie信息

瀏覽器的同源策略針對cookie也有限制作用.

當瀏覽器請求某網站時,會將本網站下所有Cookie信息提交給服務器,所以在request中可以讀取Cookie信息
注意: Session依賴於Cookie,而且flask中使用session,需要配置SECRET_KEY選項,否則報錯.
設置session
from flask import session
@app.route('/set_session')
def set_session():
    session['username'] = 'xiaoming'
    return 'ok!'
獲取session
@app.route('/get_session')
def get_session():
    return session.get('username')
before_first_request
在處理第一個請求前執行
before_request
在每次請求前執行
如果在某修飾的函數中返回了一個響應,視圖函數將不再被調用.一般可以用來判斷權限,或者轉換路由參數或者預處理客戶端的請求的數據
after_request
如果沒有拋出錯誤,在每次請求后執行.一般可以用於記錄會員/管理員的操作歷史,瀏覽歷史,清理收尾的工作
接受一個參數:視圖函數作出的響應
在此函數中可以對響應值在返回之前做最后一步修改處理
需要將參數中的響應在此參數中進行返回
teardown_request:
在每次請求后執行
接受一個參數:錯誤信息,如果有相關錯誤拋出
需要設置flask的配置DEBUG=False,teardown_request才會接受到異常對象。
捕獲指定異常類型
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    return '除數不能為0'
application 指的就是當你調用app = Flask(__name__)創建的這個對象app;
request 指的是每次http請求發生時,WSGI server(比如gunicorn)調用Flask.__call__()之后,在Flask對象內部創建的Request對象;
請求上下文對象有:request、session
應用上下文對象有:current_app,g
注意:不同的請求,會有不同的全局變量
  • 請求上下文:保存了客戶端和服務器交互的數據
  • 應用上下文:flask 應用程序運行過程中,保存的一些配置信息,比如程序名、數據庫連接、應用信息等

 通常的做法就是把token值放在header里面。


免責聲明!

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



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