簡(jiǎn)單解析Django框架中的表單驗(yàn)證
我們的搜索示例仍然相當(dāng)?shù)睾?jiǎn)單,特別從數(shù)據(jù)驗(yàn)證方面來(lái)講;我們僅僅只驗(yàn)證搜索關(guān)鍵值是否為空。 然后許多HTML表單包含著比檢測(cè)值是否為空更為復(fù)雜的驗(yàn)證。 我們都有在網(wǎng)站上見(jiàn)過(guò)類似以下的錯(cuò)誤提示信息:
- 請(qǐng)輸入一個(gè)有效的email地址, foo' 并不是一個(gè)有效的e-mail地址。
- 請(qǐng)輸入5位數(shù)的U.S 郵政編碼, 123并非是一個(gè)有效的郵政編碼。
- 請(qǐng)輸入YYYY-MM-DD格式的日期。
- 請(qǐng)輸入8位數(shù)以上并至少包含一個(gè)數(shù)字的密碼。
關(guān)于JavaScript驗(yàn)證
可以使用Javascript在客戶端瀏覽器里對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,這些知識(shí)已超出本書(shū)范圍。 要注意: 即使在客戶端已經(jīng)做了驗(yàn)證,但是服務(wù)器端仍必須再驗(yàn)證一次。 因?yàn)橛行┯脩魰?huì)將JavaScript關(guān)閉掉,并且還有一些懷有惡意的用戶會(huì)嘗試提交非法的數(shù)據(jù)來(lái)探測(cè)是否有可以攻擊的機(jī)會(huì)。
除了在服務(wù)器端對(duì)用戶提交的數(shù)據(jù)進(jìn)行驗(yàn)證(例如在視圖里驗(yàn)證),我們沒(méi)有其他辦法。 JavaScript驗(yàn)證可以看作是額外的功能,但不能作為唯一的驗(yàn)證功能。
我們來(lái)調(diào)整一下search()視圖,讓她能夠驗(yàn)證搜索關(guān)鍵詞是否小于或等于20個(gè)字符。 (為來(lái)讓例子更為顯著,我們假設(shè)如果關(guān)鍵詞超過(guò)20個(gè)字符將導(dǎo)致查詢十分緩慢)。那么該如何實(shí)現(xiàn)呢? 最簡(jiǎn)單的方式就是將邏輯處理直接嵌入到視圖里,就像這樣:
def search(request):
error = False
if 'q' in request.GET:
q = request.GET['q']
if not q:
error = True
**elif len(q) > 20:**
**error = True**
else:
books = Book.objects.filter(title__icontains=q)
return render_to_response('search_results.html',
{'books': books, 'query': q})
return render_to_response('search_form.html',
{'error': error})
現(xiàn)在,如果嘗試著提交一個(gè)超過(guò)20個(gè)字符的搜索關(guān)鍵詞,系統(tǒng)不會(huì)執(zhí)行搜索操作,而是顯示一條錯(cuò)誤提示信息。 但是,search_form.html里的這條提示信息是:”P(pán)lease submit a search term.”,這顯然是錯(cuò)誤的, 所以我們需要更精確的提示信息:
<html>
<head>
<title>Search</title>
</head>
<body>
{% if error %}
<p style="color: red;">Please submit a search term 20 characters or shorter.</p>
{% endif %}
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
但像這樣修改之后仍有一些問(wèn)題。 我們包含萬(wàn)象的提示信息很容易使人產(chǎn)生困惑: 提交一個(gè)空表單怎么會(huì)出現(xiàn)一個(gè)關(guān)于20個(gè)字符限制的提示? 所以,提示信息必須是詳細(xì)的,明確的,不會(huì)產(chǎn)生疑議。
問(wèn)題的實(shí)質(zhì)在于我們只使用來(lái)一個(gè)布爾類型的變量來(lái)檢測(cè)是否出錯(cuò),而不是使用一個(gè)列表來(lái)記錄相應(yīng)的錯(cuò)誤信息。 我們需要做如下的調(diào)整:
def search(request):
**errors = []**
if 'q' in request.GET:
q = request.GET['q']
if not q:
**errors.append('Enter a search term.')**
elif len(q) > 20:
**errors.append('Please enter at most 20 characters.')**
else:
books = Book.objects.filter(title__icontains=q)
return render_to_response('search_results.html',
{'books': books, 'query': q})
return render_to_response('search_form.html',
{**'errors': errors** })
接著,我們要修改一下search_form.html模板,現(xiàn)在需要顯示一個(gè)errors列表而不是一個(gè)布爾判斷。
<html>
<head>
<title>Search</title>
</head>
<body>
**{% if errors %}**
**<ul>**
**{% for error in errors %}**
**<li>{{ error }}</li>**
**{% endfor %}**
**</ul>**
**{% endif %}**
<form action="/search/" method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
相關(guān)文章
Python導(dǎo)入Excel數(shù)據(jù)表的幾種實(shí)現(xiàn)方式
在Python中可以使用許多庫(kù)來(lái)處理Excel文件,下面這篇文章主要給大家介紹了關(guān)于Python導(dǎo)入Excel數(shù)據(jù)表的幾種實(shí)現(xiàn)方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
基于Python Numpy的數(shù)組array和矩陣matrix詳解
下面小編就為大家分享一篇基于Python Numpy的數(shù)組array和矩陣matrix詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
解決tensorflow模型參數(shù)保存和加載的問(wèn)題
今天小編就為大家分享一篇解決tensorflow模型參數(shù)保存和加載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python實(shí)現(xiàn)代碼行數(shù)統(tǒng)計(jì)示例分享
這篇文章主要介紹了python實(shí)現(xiàn)代碼行數(shù)統(tǒng)計(jì)的示例,需要的朋友可以參考下2014-02-02
Python使用re模塊實(shí)現(xiàn)信息篩選的方法
這篇文章主要介紹了Python使用re模塊實(shí)現(xiàn)信息篩選的方法,結(jié)合實(shí)例形式分析了Python正則re模塊進(jìn)行信息篩選操作的相關(guān)實(shí)現(xiàn)技巧及相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2018-04-04
pycharm運(yùn)行程序時(shí)出現(xiàn)Run‘python tests for XXX.py‘問(wèn)題及
這篇文章主要介紹了pycharm運(yùn)行程序時(shí)出現(xiàn)Run ‘python tests for XXX.py‘問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python matplotlib繪制實(shí)時(shí)數(shù)據(jù)動(dòng)畫(huà)
Matplotlib作為Python的2D繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。本文將利用Matplotlib庫(kù)繪制實(shí)時(shí)數(shù)據(jù)動(dòng)畫(huà),感興趣的可以了解一下2022-03-03
Python Web框架Flask中使用百度云存儲(chǔ)BCS實(shí)例
這篇文章主要介紹了Python Web框架Flask中使用百度云存儲(chǔ)BCS實(shí)例,本文調(diào)用了百度云存儲(chǔ)Python SDK中的相關(guān)類,需要的朋友可以參考下2015-02-02
導(dǎo)入tensorflow時(shí)報(bào)錯(cuò):cannot import name ''abs''的解決
這篇文章主要介紹了導(dǎo)入tensorflow時(shí)報(bào)錯(cuò):cannot import name 'abs'的解決,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

