今天使用了Python的WEB框架Django進行學習,圍繞學習“表單”做了一些程序,於是就有了這份實驗報告:
期間我遇到了一些問題,例如:MultiValueDictKeyError at /add/ “‘a’” 這樣的錯誤,並最終弄懂了它是如何運行並解決這個問題。
我是從"自強學堂"上找了一些小案例——加減乘除,跟着源碼一步一步寫然後完成了效果。於是自己重新創建了一個項目開始練習我學習到的知識:
通過request.GET這樣的方法獲取我前端頁面上提交過來的"a"&"b"兩個值
(通過form表單,get提交方式)
[views.py]: #這是它的設計思想
a = int(request.GET['a']) #我把他們變成int類型
b = int(request.GET['b'])
return HttpResponse(str(a+b)) #這個HttpResponse大家都會用,只接受str參數
HttpResponse是直接將字符串渲染到當前頁面,會蓋住頁面原有的內容。
其實總的來看這非常簡單:但是這只是一個開始——在實驗步驟上我不太想貼太多代碼,免得大家看的繁複,我只提供設計思想。所以接下來我還是得有必要補充一下前端的內容。
我只寫了一個前端頁面,用於提交表單到後臺,但是它的提交地址指向了另一個URL:^add$,所以我寫了第二個視圖函數——許多關鍵問題就出現在這裏!
[views.py]:
def add(request):
if request.method == 'GET':
a = int(request.GET['a'])
b = int(request.GET['b'])
return HrrpResponse(str(a+b))
return HttpResponse("Here not a world.")
這並沒有什麼特別的,只是多了一個步驟:if request.method == 'GET’罷了。
我在想,我通過提交表單的值,跳轉到相應URL,執行相關參數的時候,他可以正常顯示。那我如果直接輸入他的URL——而不傳遞任何的值呢?
[url:127.0.0.1/add/]:
MultiValueDictKeyError at /add/
"'a'"
Request Method: GET
Request URL: http://127.0.0.1:8000/add/
...調試界面的錯誤云云
無非就是系統找不到a = request.GET['a‘] 這一步的值"a"而已,所以無法順序執行。
你猜怎麼着?我寫了個異常處理。
[views.py]:
if request.method == 'GET':
try:
a = int(request.GET['a'])
b = int(request.GET['b'])
return HttpResponse(str(a+b))
except:
return HttpResponse('沒有值')
return HttpResponse('Here not a world.')
頁面上赤裸裸地掛着三個字:沒有值。說明了什麼?
通過這些嘗試我發現我真正進一步領會了頁面常用的 “POST"與"GET” 兩種請求方法:那就是隻要你點開一個頁面(可以說是輸入一個URL並且按下回車),他默認的請求方法就是GET,不論你是否提交數據。對於它來說,只要你不指定其他的提交方法,if request == ‘GET’ 就始終等於True.
而這就是爲什麼其實很簡單的一個東西我卻想了半天,因爲if request == 'POST’不總是等於True這樣的思想影響到了我,使我覺得,只要我不寫(提交方法)他就不會執行。