iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

BeautifulSoup網頁爬蟲佐Django伺服器框架附AWS雲端運算服務系列 第 16

[Day 16] 第一主餐 pt.8-我帶幾個data去。你就在此地,不要走動

  • 分享至 

  • xImage
  •  

上一篇由於作者有點不舒服,因此用了HTTP code灌水...不是...
因此中場先講些HTTP code的東東放鬆一下
今天身體好多了,那就來繼續我們的主線吧
接下來我們就要來進入更進階的request,以及介紹好用的送request用程式
廢話不多說,咱們累狗~

Postman-WEB界的郵差

上一篇我們測試API是直接使用輸入url的方式測試
這種測試通常都是不帶data的,而且也沒有指定傳輸方式
因此傳輸時的預設方式就叫做get
get method簡單來說就是,這個request"通常"只會跟server要特定資料
不會去改變server內的狀態或是data
對,所以我們前一篇這樣寫是有問題的,但由於要講解方便,因此先用get來演示
那如果要去改變server內的data或是行為,這時候我們就要用post
post的方式通常會帶一個data,這個data可能是from,可能是JSON,也可能是各種可以分辨欄位內容的東東
server接到post後就會看你post裡面有啥,然後再做分門別類的處理
那還有兩個PUT跟DELETE,這個我們以後再說
我們先把目光著重在GET跟POST就好

那GET的方式簡單來說就是送個url就好
那POST怎麼辦,總不可能為了POST寫一個form吧
當然不會,因此這裡就要介紹好用的API測試軟體-Postman啦
這東東簡單來說就是你只要
給他網址、給他data、給他method
他就會幫你執行並且接好response啦
廢話不多說,我們先來下載Postman一窺究竟就知道啦
先來這邊下載Postman,看你要用網頁版還是OS版都可
不過我個人還是比較喜歡OS版就是
https://www.postman.com/downloads/
(下載頁面應該像這樣)

下載完之後執行,泡茶等他好就行
好了下載完之後打開應該長這樣

這邊他會問你要不要登入,不過我懶,按下下面的skip and go就好

接著我們就會進入主頁面,應該會長這樣

然後我們這裡可以像chrome一樣用新增頁面的方式新增request
新增完後應該會有這個頁面

我們在這裡選擇get
然後輸入前前一篇提到的url
http://172.16.15.123:8000/stonks/clear_table/

由於是get,所以我們就不用設定輸入data
好的,點下執行

可以看到回傳的東東的確跟我們上一篇執行的結果一模一樣

接著我們看資料庫的部分
如果你嫌server要開開關關太麻煩,可以再額外開一個cmder用來查看DB
我們開啟shell,看一下model內有無object
輸入DBTest.objects.all()看一下table內所有資料

恩,果然沒資料,看來執行的非常成功

POST request - 帶球上籃

接著我們就要來修改test_api這支API變成可以接POST的模式啦
要怎麼接POST呢,非常簡單
還記得我們的API function裡面有參數request嗎
那個就是當request發起時,傳進來的參數
所以我們只要從request找參數就好
廢話不多說,動工
我們在Body的頁面加入這個欄位

沒有啜啦,就是這麼DD

好啦,雖然我們另一邊的POST接收還沒寫,但還是測試一下吧
將網址改成http://172.16.15.123:8000/stonks/test_api/(POST記得最後面要加/)
送出

...WHAT

好的,我們收到了403
但我們連admin都還沒設定,怎會有403勒
往下一拖


...又是你,CSRF

CSRF是啥東東呢
這有點複雜,詳細說明可以看維基百科
https://en.wikipedia.org/wiki/Cross-site_request_forgery
簡單來說就是,每個網頁都有獨立的保安
你拿了一個憑證token上面會寫for哪個保安的
那個token如果給別的保安,或是上面沒註明給哪個保安
你就會無情的收到CSRF forbidden
那怎辦呢,簡單
我們先import csrf_exempt這個function
from django.views.decorators.csrf import csrf_exempt
我們就把這隻API前面加個裝飾function
@csrf_exempt
這樣就好
就像下面的CODE這樣

from django.http import JsonResponse #剛剛的JsonResponse套件
from stonks_index.models import DBTest #從models.py import DBTest 物件
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
@csrf_exempt
def test_api(request):

    #建立新的DBTest object
    new_obj = DBTest()

    #把新建立的object內的test屬性改成"I love Amane Kanata"
    new_obj.test = "I love Amane Kanata"

    #儲存object
    new_obj.save()

    #回傳200,這裡使用JsonResponse,data記得回傳格式為dict
    return JsonResponse(data={'msg':'add object success.'}, status=200)
    
...

再測試一次

終於成功過關啦

接下來就是改API側啦
改之前記得執行http://172.16.15.123:8000/stonks/clear_table 清理資料

接著我們進入views.py,將api_test的code修改成如下

@csrf_exempt
def test_api(request):

    #先撈POST request body,輸入應該會是一個dict
    body = request.POST

    #將body內的name取出
    name = body['name']
    
    #建立新的DBTest object
    new_obj = DBTest()

    #把新建立的object內的test屬性改成"I love {POST['name']}"
    new_obj.test = "I love " + name

    #儲存object
    new_obj.save()

    #回傳200,這裡使用JsonResponse,data回傳格式為dict,將name與成功訊息結合方便察看結果
    return JsonResponse(data={'msg':name + ' add object success.'}, status=200)

註解有詳細講解每個步驟了,這裡就不多加贅述啦
儲存完後再用postman call一次API

成功執行
接著看table

成功加入
這樣設定之後,你要在POST的name欄位加甚麼Suisei、Subaru、Rushia都可以啦(?

好的,以上就是本次的內容啦
接下來我們終於要來存點正經的東西了
我們會對Database做大幅修改
並將前面BeautifulSoup撈出來的東東存到Database裡
欲知叢林會冒出甚麼激烈的火花
咱們下回分解~


上一篇
[Day 15]中場休息-HTTP Status Code的那些故事
下一篇
[Day 17] 第一主餐 pt.9-戰前準備
系列文
BeautifulSoup網頁爬蟲佐Django伺服器框架附AWS雲端運算服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言