Django學習系列16:處理完POST請求后重定向


處理完POST請求后重定向

代碼中new_item_text = ''的寫法不怎么樣。解決第二個問題時候,順帶把這個問題也解決了。

人們都說處理完post請求后一定要重定向,接下來就實現這個功能吧。修改針對保存POST請求數據的單元測試,不讓它渲染包含待辦事項的響應,而是重定向到首頁。

lists/tests.py

    def test_can_save_a_post_request(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new list item') self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/')

不需要再拿響應中的.content 屬性值和渲染模板得到的結果比較,因此把相應的斷言刪掉了。現在,響應是HTTP重定向,狀態碼是302,讓瀏覽器指向一個新地址。修改之后運行結果200!=302,現在可以大幅度清理視圖函數了

from django.shortcuts import render, redirect from lists.models import Item from django.http import HttpResponse # Create your views here.在這兒編寫視圖 def home_page(request): if request.method == 'POST': Item.objects.create(text=request.POST['item_text']) return redirect('/') return render(request,'home.html')

現在測試可以通過了python manage.py test

----------------------------------------------------------------------
Ran 5 tests in 0.012s

OK
Destroying test database for alias 'default'...

 

更好的單元測試實踐方法,一個測試只測試一件事

單元測試實踐方法要求,一個測試只能測試一件事,因為這樣便於查找問題。如果一個測試中有多個斷言,一旦前面的斷言導致失敗,就無法得知后面的斷言情況如何(如,如果不小心破壞了視圖函數,我們想知道到底是保存對象時出錯了,還是響應的類型出錯了)

剛開始可能無法寫出只有一個斷言的完美單元測試,不過現在可以把正在開發的功能分開測試(上面一個功能分為兩個)。

#lists/tests.py

def test_can_save_a_post_request(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new list item') def test_redirects_after_POST(self): response = self.client.post('/', data={'item_text': 'A new list item'}) self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/')

現在運行應該看見有六個測試通過,而不是五個。

----------------------------------------------------------------------
Ran 6 tests in 0.014s

OK
Destroying test database for alias 'default'...

 


免責聲明!

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



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