實戰blogs-day9-10 API

實戰blogs-day9-10 API

標籤(空格分隔): 筆記 API


1、 API(Application Programming Interface,應用程序編程接口)
提供應用程序與開發人員基於某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。
由於API就是把Web App的功能全部封裝了,所以,通過API操作數據,可以極大地把前端和後端的代碼隔離,使得後端代碼易於測試,前端代碼編寫更簡單。
一個API也是一個URL的處理函數,我們希望能直接通過一個@api來把函數變成JSON格式的REST API,這樣,獲取註冊用戶可以用一個API實現如下:

@get('/api/users')
def api_get_users(*, page='1'):
    page_index = get_page_index(page)
    num = yield from User.findNumber('count(id)')
    p = Page(num, page_index)
    if num == 0:
        return dict(page=p, users=())
    users = yield from User.findAll(orderBy='created_at desc', limit=(p.offset, p.limit))
    for u in users:
        u.passwd = '******'
    return dict(page=p, users=users)

只要返回一個dict,後續的response這個middleware就可以把結果序列化爲JSON並返回。

我們需要對Error進行處理,因此定義一個APIError,這種Error是指API調用時發生了邏輯錯誤(比如用戶不存在),其他的Error視爲Bug,返回的錯誤代碼爲internalerror。

2、 REST風格

自從Roy Fielding博士在2000年他的博士論文中提出REST(Representational State Transfer)風格的軟件架構模式後,REST就基本上迅速取代了複雜而笨重的SOAP,成爲Web API的標準了。

3、JSON

4、middleware
middleware是一種攔截器,一個URL在被某個函數處理前,可以經過一系列的middleware的處理。
一個middleware可以改變URL的輸入、輸出,甚至可以決定不繼續處理而直接返回。middleware的用處就在於把通用的功能從每個URL處理函數中拿出來,集中放到一個地方。例如,一個記錄URL日誌的logger可以簡單定義如下:

5、 正則表達式re

6、 cookie & session

https://www.zhihu.com/question/19786827
用戶登錄比用戶註冊複雜。由於HTTP協議是一種無狀態協議,而服務器要跟蹤用戶狀態,就只能通過cookie實現。大多數Web框架提供了Session功能來封裝保存用戶狀態的cookie。

Session的優點是簡單易用,可以直接從Session中取出用戶登錄信息。

Session的缺點是服務器需要在內存中維護一個映射表來存儲用戶登錄信息,如果有兩臺以上服務器,就需要對Session做集羣,因此,使用Session的Web App很難擴展。

我們採用直接讀取cookie的方式來驗證用戶登錄,每次用戶訪問任意URL,都會對cookie進行驗證,這種方式的好處是保證服務器處理任意的URL都是無狀態的,可以擴展到多臺服務器。

由於登錄成功後是由服務器生成一個cookie發送給瀏覽器,所以,要保證這個cookie不會被客戶端僞造出來。

實現防僞造cookie的關鍵是通過一個單向算法(例如SHA1),舉例如下:

當用戶輸入了正確的口令登錄成功後,服務器可以從數據庫取到用戶的id,並按照如下方式計算出一個字符串:

“用戶id” + “過期時間” + SHA1(“用戶id” + “用戶口令” + “過期時間” + “SecretKey”)

當瀏覽器發送cookie到服務器端後,服務器可以拿到的信息包括:

  • 用戶id

  • 過期時間

  • SHA1值

如果未到過期時間,服務器就根據用戶id查找用戶口令,並計算:

SHA1(“用戶id” + “用戶口令” + “過期時間” + “SecretKey”)

並與瀏覽器cookie中的哈希進行比較,如果相等,則說明用戶已登錄,否則,cookie就是僞造的。

這個算法的關鍵在於SHA1是一種單向算法,即可以通過原始字符串計算出SHA1結果,但無法通過SHA1結果反推出原始字符串。
7、 wapper

問題1:

ERROR:aiohttp.server:Error handling request
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\web_protocol.py", line 381, in start
    resp = await self._request_handler(request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\web_app.py", line 322, in _handle
    resp = await handler(request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\web_middlewares.py", line 88, in impl
    return await handler(request)
  File "E:/studyy/python/webapp/www/app.py", line 47, in logger
    return (await handler(request))
  File "E:/studyy/python/webapp/www/app.py", line 103, in response
    r['__user__'] = request.__user__
AttributeError: 'Request' object has no attribute '__user__'
INFO:aiohttp.access:127.0.0.1 [25/Apr/2018:08:07:35 +0000] "GET / HTTP/1.1" 500 330 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章