1. 程式人生 > >看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

感覺這篇文章應該是非常實用的。現在給大家分享下。

這裡推薦下我自己建的python群:595266089,不管你是小白還是大牛,小編我都挺歡迎,不定期分享乾貨,包括2017最新的python企業案例學習資料和零基礎入門教程,歡迎初學和進階中的小夥伴。

Ps:我下載了,但是和書中出入比較大,建議還是自己按照書碼字吧。

5.1 Django-bootstrap3

Bootstrap:源於Twitter,是目前很受歡迎的前端框架。Bootstrap是基於HTML、CSS、JavaScript的,它簡潔靈活,使得Web開發更加快捷。它由Twitter的設計師Mark Otto、Jacob Thornton合作開發,是一個CSS/HTML框架。Bootstrap提供了優雅的HTML和CSS規範,它由動態CSS語言Less寫成。

Django-bootstrap3:是整合到Django的一個應用,使用如下命令安裝:

pip install django-bootstrap3

修改/guest/settings.py檔案,增加bootstrap3應用:

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'sign', 'bootstrap3',

5.2 釋出會管理

5.2.1 釋出會列表

修改/guest/sign/views.py檔案:

# 從sign應用中匯入models中的Event類from sign.models import Event# 釋出會管理@login_requireddef event_manage(request):

修改/guest/sign/templates/event_manage.html檔案:

<!DOCTYPE html><html>

通過頁面訪問效果如下:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

5.2.2 搜尋功能

搜尋功能需要分別修改:html模板、url路徑、views函式,如下:

修改/guest/sign/templats/event_manage.html檔案:

 <!-- 釋出會搜尋表單 -->

修改/guest/urls.py檔案:

urlpatterns = [

修改/guest/sign/views.py檔案:

# 釋出會名稱搜尋@login_requireddef search_name(request):

搜尋功能:通過GET方法接收搜尋關鍵字,並通過模糊查詢,匹配發佈會name欄位,然後把匹配到的釋出會列表返回給客戶端。

5.3 嘉賓管理

嘉賓管理頁面的開發與釋出會管理頁面基本一致!

5.3.1 嘉賓列表

首先修改/guest/sign/templates/guest_manage.html檔案:

<!DOCTYPE html><html lang="zh_CN">

修改/guest/urls.py檔案:

urlpatterns = [

修改/guest/sign/views.py檔案:

# 從sign應用中匯入models中的Guest類from sign.models import Event, Guest# 嘉賓管理@login_requireddef guest_manage(request):

給嘉賓管理頁面增加搜尋功能,可以完全參考上面釋出會管理頁面的,分別在如下檔案中增加程式碼:

/guest/sign/templates/guest_manage.html:

 <!-- 釋出會搜尋表單 -->

/guest/sign/views.py:

# 嘉賓名稱搜尋@login_requireddef search_realname(request):

/guest/urls.py:

urlpatterns = [

5.3.2 分頁器

對顯示內容過多的情況下使用分頁功能。

Django的分頁功能Paginator類的基本功能演示:

[email protected]:/home/test/guest# python manage.py shell>>> from django.core.paginator import Paginator # 匯入Paginator類>>> from sign.models import Guest # 匯入sign應用models下的Guest表>>> guest_list = Guest.objects.all() # 獲取guest的全部資料>>> p = Paginator(guest_list,2) # 建立每頁2條資料的分頁器>>> p.count # 檢視共有多少條資料6>>> p.page_range # 檢視公有多少分頁(每頁2條資料,迴圈結果為1、2、3,共3頁)xrange(1, 4)>>> page1 = p.page(1) # 獲取第1頁資料>>> page1 # 當前是第幾頁<Page 1 of 3>>>> page1.object_list # 獲取當前頁的物件<QuerySet [<Guest: 崔宇>, <Guest: Andy>]>>>> for g in page1: # 使用for迴圈列印第1頁嘉賓的realname... g.realname... u'\u5d14\u5b87'u'Andy'>>> >>> page2 = p.page(2) # 獲取第2頁資料>>> page2.start_index() # 本頁第一條資料的索引3>>> page2.end_index() # 本頁最後一條資料的索引4>>> page2.has_previous() # 本頁是否有上一頁True>>> page2.has_next() # 本頁是否有下一頁True>>> page2.previous_page_number() # 本頁的上一頁是第幾頁1>>> page2.next_page_number() # 本頁的下一頁是第幾頁3>>> page3 = p.page(3) # 獲取第3頁資料>>> page3.has_next() # 本頁是否有下一頁False>>> page3.has_previous() # 本頁是否有上一頁True>>> page3.has_other_pages() # 是否還有其他頁True>>> page3.previous_page_number() # 本頁的上一頁是第幾頁2>>> 12345678910111213141516171819202122232425262728293031323334353637383940414243441234567891011121314151617181920212223242526272829303132333435363738394041424344

對嘉賓管理頁面,增加分頁器。

修改/guest/sign/views.py檔案:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger# 嘉賓管理@login_requireddef guest_manage(request):

修改/guest/sign/templates/guest_manage.html檔案:

 <!-- 列表分頁器 -->

上面的程式碼就不做過多解釋了,因為蟲師在書中也沒有做詳細的說明,可能是覺得大家的技術水平,對於閱讀HTML程式碼,應該不成問題,我這裡,簡單說明,先是判斷是否有上一頁,有則previous可以點選,並且url頁面會跳轉到上一頁,當前只顯示當前頁和總頁數,如果有下一頁,則next可以點選,並且url頁面會跳轉到下一頁。

這裡,蟲師又說到,如果開發了嘉賓搜尋功能:“那麼同樣需要在搜尋檢視中新增分頁功能。”

但是,書中並沒有給出相關程式碼,我這裡出於好奇,也是覺得既然自己開發了嘉賓搜尋功能,那麼這個分頁器似乎也不太難,照搬應該就能給搜尋功能同樣新增一個分頁器吧。

於是,自己參考上面的程式碼,開始給搜尋功能增加分頁器,問題就接踵而至了(Ps:筆者半路出家,對前端只瞭解那麼可憐的一丟丟),下面就是自己遇到的問題,以及解決的辦法,對於我來說,能夠靠自己的仔細觀察和動手實踐解決這個問題,真的讓自己著實開心了好一下,感覺自己的堅持學習,總算是有收穫的!

首先,自己是完全沒有分析,想當然的,把上面的程式碼直接插入到了嘉賓搜尋的views.py中:

# 嘉賓名稱搜尋@login_requireddef search_realname(request):

然後, html程式碼沒做任何改變,嘗試是否生效,為了驗證搜尋結果大於一頁,我在嘉賓列表裡添加了如下資料:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

這樣如果我在嘉賓列表頁面搜尋“Andy”就會模糊匹配到三條結果,分頁器的效果就能展示出來了,每頁展示2條,那麼會有總共2頁:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

當看到這個效果的時候,我很開心啊,顯示的結果完全符合預期,這很簡單啊,但是,當我點選next按鈕時,按理來說,應該展示搜尋結果的第二頁內容,也就是隻展示一條Andy3才對,可實際卻是,當我點選next按鈕後,頁面重新整理,返回到了嘉賓列表頁面,嘉賓列表和分頁器全部和搜尋之前一樣了。

神啊,為什麼會這樣,為什麼在搜尋的第一頁是正確的,但是點選了next就完全不對了???

看來真的不是這麼簡單,完全照搬程式碼,是不對的!還是要分析下分頁器的功能到底在嘉賓列表和嘉賓搜尋結果兩者之間有什麼區別!

下面就是自己分析以及解決的過程:

  1. 分頁器無論是在嘉賓列表頁面還是在嘉賓搜尋頁面,分頁器在展示效果上應該是同一套,只是展示結果不同,嘉賓列表要根據嘉賓總數及每頁展示數量進行展示,而嘉賓搜尋結果改變了嘉賓總數,對於這一點,上述程式碼沒有問題,是符合預期的,也就是說html裡的分頁器程式碼並沒錯;

  2. 但是為什麼會出現點選了next按鈕後,頁面就返回到了嘉賓列表頁面呢,看來問題是出在這個next按鈕上,我們仔細觀察URL的變化:

  • 正常展示嘉賓列表時URL為:http://127.0.0.1:8000/guest_manage/

  • 此時next按鈕的URL為:http://127.0.0.1:8000/guest_manage/?page=2

  • 當使用搜索按鈕過濾“Andy”時URL為:http://127.0.0.1:8000/search_realname/?realname=Andy

  • 此時next按鈕的URL為:http://127.0.0.1:8000/search_realname/?page=2

  • 如果我們在搜尋結果中點選next按鈕,雖然路徑仍然是“/search_realname/”,但是明顯是缺少了過濾條件“?realname=Andy”,所以才導致雖然點選的是下一頁“?page=2”,但是最終結果仍然是全部嘉賓列表;

  • 那是不是我們把過濾條件和分頁器組合一下,結果就對了呢?嘗試在瀏覽器中輸入URL:http://127.0.0.1:8000/search_realname/?page=2&realname=Andy,結果真的是隻展示了搜尋條件下的第二頁內容:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

現在問題是知道了,接下來就是如何去解決了:

先要理清一些對應關係:

http://127.0.0.1:8000/search_realname/?page=2&realname=Andy

  • /search_realname/:對應views.py檔案裡的def search_realname函式;

  • ?page=2:對應guest_manage.html裡分頁器a標籤href指定的URL;

return render(request,"guest_manage.html", {"user": username, "guests": contacts})

  • guests:對應guest_manage.html裡分頁器a標籤href指定的page值,即page={{ guests.next_page_number }}

理清上面這點,才能知道怎麼去改,也就是說,我們要想達到在嘉賓搜尋列表下分頁,需要同時修改views.py以及guest_manage.html兩個檔案:

首先修改/guest/sign/views.py檔案:

# 嘉賓名稱搜尋@login_requireddef search_realname(request):

然後修改/guest/sign/templates/guest_manage.html檔案,不過修改之前,我們還需要理清一個點就是,分頁器雖然是一段程式碼,但是嘉賓展示列表和嘉賓搜尋結果列表,都要同時使用這一段分頁器程式碼,所以我們就必須要區分出,什麼時候該展示嘉賓列表的分頁器,什麼時候該展示嘉賓搜尋結果列表的分頁器,使用Django模板標籤裡的{% if %}對搜尋名稱來判斷,應該是合理的,最終程式碼如下:

 <!-- 列表分頁器 -->

完成上述操作後,就實現了,既能正確展示嘉賓列表的分頁,也能正確展示嘉賓搜尋結果的分頁,並且分頁內容及功能都正確了。

5.4 簽到功能

5.4.1 添加簽到連結

釋出會與簽到功能,是一一對應的關係。

給每個釋出會都提供一個“簽到”連結:

修改/guest/sign/templates/event_manage.html檔案:

<!-- 釋出會列表 -->

通過上述程式碼實現的功能就是:當點選“sign”連結時,路徑會自動跳轉到與event.id相對應的簽到頁面(當前還未開發)。

增加簽到頁面的路徑:

修改/guest/urls.py檔案:

from sign import views

與之前略有不同,括號內的內容匹配發佈會id,限制只能是數字,匹配的數字eid將會作為sign_index()檢視函式的引數。

5.4.2 簽到頁面

首先,建立簽到頁面的sign_index()檢視函式:

修改/guest/sign/views.py:

from django.shortcuts import render, get_object_or_404# 簽到頁面@login_requireddef sign_index(request, eid):

get_object_or_404()方法:預設呼叫Django的table.objects.get()方法,如果查詢的物件不存在,則會丟擲一個HTTP 404異常,這樣就省去了對table.objects.get()方法做異常斷言。

然後,建立簽到頁面模板html:

修改/guest/sign/templates/sign_index.html檔案:

<!DOCTYPE html><html>

新增完html頁面後,點選sign跳轉到簽到頁面,結果完全沒有樣式,才想起來,忘記載入bootstrap3了。在程式碼head部分加上。

html各功能解釋參考備註。

5.4.3 簽到動作

繼續完善簽到功能,上面是完成了sign_index簽到頁面,接下來就是對簽到動作也就是sign_index_action相關功能。

首先,添加簽到動作的路徑:

修改/guest/urls.py檔案:

from sign import views

其次,增加簽到動作的檢視函式:

修改/guest/sign/views.py檔案:

# 簽到動作@login_requireddef sign_index_action(request, eid):

簽到動作最關鍵的就是對輸入的手機號以及手機號對應的釋出會的對應關係的一個判斷,所以sign_index_action裡最多的就是if判斷,詳細見備註。

這裡蟲師又給大家挖了個坑!!!

當我按照上面的程式碼進行編寫後,在簽到頁面輸入一個手機號,點選簽到按鈕,系統居然提示403錯誤:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

這是神馬情況,明顯是身份認證的錯誤,這在之前做登入認證頁面的時候,好像也見過。

蟲師之前說過的一段話很好,就是要仔細閱讀錯誤資訊,也許答案就在其中,再回頭看簽到功能相關程式碼,我們發現問題出現在兩個地方:

問題1:

我們在視圖裡定義sign相關函式的時候,都加了裝飾器@login_required,但是在返回給頁面的時候,沒有加使用者資訊。

問題2:

我們在模板sign_index.html裡,在定義簽到功能的時候,使用了POST請求,而POST請求必須有{% csrf_token %}標籤才可以。

綜合以上兩點,做出修改如下修改:

首先是/guest/sign/views.py檔案:

# 簽到頁面@login_requireddef sign_index(request, eid):

然後是/guest/sign/templates/sign_index.html檔案:

<!-- 簽到功能 -->

經過上述修改後,再次嘗試使用手機號進行簽到,效果就和書中一樣了:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

蟲師留的作業:

要求是:如何將當前釋出的嘉賓數和已簽到數顯示在簽到頁面上。簽到嘉賓數固定,每成功簽到一位嘉賓,就將簽到數加1,這樣我們就可以實時知道當前釋出會還有多少嘉賓未簽到了。

首先,分析需求,需求僅要求我們將幾個重要的資料展示出來:

  • 一個釋出會總的嘉賓數量,固定值,通過查詢嘉賓資料表,指定釋出會id即可;

  • 一個已簽到的嘉賓數量,可變值,每當成功簽到一位嘉賓,該值就加1,已簽到嘉賓可通過查詢嘉賓資料表,指定sign欄位為1即可;

將上述資訊展示在簽到頁面,格式無所謂,我理解蟲師的本意,初始情況,應該是先獲取一個總共的嘉賓數,再獲取一個已簽到嘉賓數,將這兩個值展示出來,但是當用戶使用手機號進行簽到後,就要將已簽到嘉賓數加1展示,也就是已簽到嘉賓數要初始獲取一個固定值,每當簽到成功後,該值加1,簽到不成功,不加1,理清了這些需求,剩下就是實現了。

同樣還是需要對兩處進行改動:

  • 一是視圖裡的sign_indext_action函式,增加這兩個值的處理;

  • 二是模板裡的sign_index.html函式,增加展示的相關內容;

修改/guest/sign/views.py檔案:

from django.shortcuts import render, get_object_or_404, get_list_or_404# 簽到頁面@login_requireddef sign_index(request, eid):

這裡最關鍵的有三點:

第一,是我們使用了新的獲取資料表物件列表的方法get_list_or_404(),該方法會返回查詢資料結果列表,如果沒有查詢到指定資料就返回404錯誤頁面;

第二,我們希望是進入到簽到頁面就展示嘉賓總數和已簽到嘉賓數,當只有簽到成功後,才變更已簽到嘉賓數,所以在sign_index函式和sign_index_action兩個函式都使用這兩個變數;

第三,我們希望只在簽到成功才變更已簽到數量,其餘時候都只是返回當前的嘉賓總數和已簽到嘉賓數;

最終效果如下:

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

看看大牛是怎麼用Web介面開發與自動化測試基於Python語言

5.5 退出系統

最後來實現退出系統功能。

修改/guest/urls.py檔案,增加退出路徑:

from sign import views

修改/guest/sign/views.py檔案,增加logout()檢視函式:

# 退出動作@login_requireddef logout(request):

Django的auth.login()方法用於驗證登入使用者資訊,同時也提供了auth.logout()方法用於退出系統,它可以清除瀏覽器儲存的使用者資訊,這樣使用者就不用考慮如何刪除瀏覽器的cookie資訊。退出成功後,頁面跳轉至/index/首頁。

總結:

第五章可以說是對釋出會、嘉賓、簽到三者功能上的一個大概實現。通過本章,該功能已經初步可用。程式碼比較多,我自己也加了很多的註釋,通過發現書中的問題,以及解決,對Django的MTV開發模式有了更清楚的認識,清楚了三者之間如何聯動,如何實現。知識點主要集中在檢視函式的幾個庫函式的使用,以及簡單使用bootstrap3來裝扮html的樣式。

可以說,多自己動手,多自己思考,才是消化這章的最佳辦法。因為有些問題是我自己處理的,如果大家在閱讀過程中發現有錯誤,或者更好的辦法,歡迎交流指正。