在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 14.3 表單及驗證支持
7 文本處理
3 Web基礎
14 擴展Web框架
10.4 小結
2.2 Go基礎
2.8 總結
6.1 session和cookie
5.5 使用beedb庫進行ORM開發(fā)
8.3 REST
13.6 小結
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調試
7.7 小結
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結
13 如何設計一個Web框架
14.3 表單及驗證支持
12 部署與維護
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結
9.4 避免SQL注入
12.1 應用日志
4.2 驗證表單的輸入
10.1 設置默認地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測試用例
8 Web服務
12.3 應用部署
5.7 小結
12.5 小結
11 錯誤處理,調試和測試
9.2 確保輸入過濾
14.2 Session支持
6.4 預防session劫持
12.4 備份和恢復
8.1 Socket編程
13.1 項目規(guī)劃
13.4 日志和配置設計
7.6 字符串處理
13.2 自定義路由器設計
6.3 session存儲
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點
7.5 文件操作
7.4 模板處理
9.1 預防CSRF攻擊
13.3 controller設計
2.6 interface
14.4 用戶認證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯誤處理
9.5 存儲密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯誤處理
6 session和數(shù)據(jù)存儲
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向對象
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結
13.5 實現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結
4.3 預防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結
3.2 Go搭建一個Web服務器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結
1.4 Go開發(fā)工具
11.4 小結
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結
8.4 RPC

14.3 表單及驗證支持

在Web開發(fā)中對于這樣的一個流程可能很眼熟:

  • 打開一個網(wǎng)頁顯示出表單。
  • 用戶填寫并提交了表單。
  • 如果用戶提交了一些無效的信息,或者可能漏掉了一個必填項,表單將會連同用戶的數(shù)據(jù)和錯誤問題的描述信息返回。
  • 用戶再次填寫,繼續(xù)上一步過程,直到提交了一個有效的表單。

在接收端,腳本必須:

  • 檢查用戶遞交的表單數(shù)據(jù)。
  • 驗證數(shù)據(jù)是否為正確的類型,合適的標準。例如,如果一個用戶名被提交,它必須被驗證是否只包含了允許的字符。它必須有一個最小長度,不能超過最大長度。用戶名不能與已存在的他人用戶名重復,甚至是一個保留字等。
  • 過濾數(shù)據(jù)并清理不安全字符,保證邏輯處理中接收的數(shù)據(jù)是安全的。
  • 如果需要,預格式化數(shù)據(jù)(數(shù)據(jù)需要清除空白或者經(jīng)過HTML編碼等等。)
  • 準備好數(shù)據(jù),插入數(shù)據(jù)庫。

盡管上面的過程并不是很復雜,但是通常情況下需要編寫很多代碼,而且為了顯示錯誤信息,在網(wǎng)頁中經(jīng)常要使用多種不同的控制結構。創(chuàng)建表單驗證雖簡單,實施起來實在枯燥無味。

表單和驗證

對于開發(fā)者來說,一般開發(fā)過程都是相當復雜,而且大多是在重復一樣的工作。假設一個場景項目中忽然需要增加一個表單數(shù)據(jù),那么局部代碼的整個流程都需要修改。我們知道Go里面struct是常用的一個數(shù)據(jù)結構,因此beego的form采用了struct來處理表單信息。

首先定義一個開發(fā)Web應用時相對應的struct,一個字段對應一個form元素,通過struct的tag來定義相應的元素信息和驗證信息,如下所示:

type User struct{
    Username    string  `form:text,valid:required`
    Nickname    string  `form:text,valid:required`
    Age         int     `form:text,valid:required|numeric`
    Email       string  `form:text,valid:required|valid_email`
    Introduce   string  `form:textarea`
}

定義好struct之后接下來在controller中這樣操作

func (this *AddController) Get() {
    this.Data["form"] = beego.Form(&User{})
    this.Layout = "admin/layout.html"
    this.TplNames = "admin/add.tpl"
}       

在模板中這樣顯示表單

<h1>New Blog Post</h1>
<form action="" method="post">
{{.form.render()}}
</form>

上面我們定義好了整個的第一步,從struct到顯示表單的過程,接下來就是用戶填寫信息,服務器端接收數(shù)據(jù)然后驗證,最后插入數(shù)據(jù)庫。

func (this *AddController) Post() {
    var user User
    form := this.GetInput(&user)
    if !form.Validates() {
        return 
    }
    models.UserInsert(&user)
    this.Ctx.Redirect(302, "/admin/index")
}       

表單類型

以下列表列出來了對應的form元素信息:

名稱 參數(shù) 功能描述
text No textbox輸入框
button No 按鈕
checkbox No 多選擇框
dropdown No 下拉選擇框
file No 文件上傳
hidden No 隱藏元素
password No 密碼輸入框
radio No 單選框
textarea No 文本輸入框

表單驗證

以下列表將列出可被使用的原生規(guī)則

規(guī)則 參數(shù) 描述 舉例
required No 如果元素為空,則返回FALSE ?
matches Yes 如果表單元素的值與參數(shù)中對應的表單字段的值不相等,則返回FALSE matches[form_item]
is_unique Yes 如果表單元素的值與指定數(shù)據(jù)表欄位有重復,則返回False(譯者注:比如is_unique[User.Email],那么驗證類會去查找User表中Email欄位有沒有與表單元素一樣的值,如存重復,則返回false,這樣開發(fā)者就不必另寫Callback驗證代碼。) is_unique[table.field]
min_length Yes 如果表單元素值的字符長度少于參數(shù)中定義的數(shù)字,則返回FALSE min_length[6]
max_length Yes 如果表單元素值的字符長度大于參數(shù)中定義的數(shù)字,則返回FALSE max_length[12]
exact_length Yes 如果表單元素值的字符長度與參數(shù)中定義的數(shù)字不符,則返回FALSE exact_length[8]
greater_than Yes 如果表單元素值是非數(shù)字類型,或小于參數(shù)定義的值,則返回FALSE greater_than[8]
less_than Yes 如果表單元素值是非數(shù)字類型,或大于參數(shù)定義的值,則返回FALSE less_than[8]
alpha No 如果表單元素值中包含除字母以外的其他字符,則返回FALSE ?
alpha_numeric No 如果表單元素值中包含除字母和數(shù)字以外的其他字符,則返回FALSE ?
alpha_dash No 如果表單元素值中包含除字母/數(shù)字/下劃線/破折號以外的其他字符,則返回FALSE ?
numeric No 如果表單元素值中包含除數(shù)字以外的字符,則返回 FALSE ?
integer No 如果表單元素中包含除整數(shù)以外的字符,則返回FALSE ?
decimal Yes 如果表單元素中輸入(非小數(shù))不完整的值,則返回FALSE ?
is_natural No 如果表單元素值中包含了非自然數(shù)的其他數(shù)值 (其他數(shù)值不包括零),則返回FALSE。自然數(shù)形如:0,1,2,3....等等。 ?
is_natural_no_zero No 如果表單元素值包含了非自然數(shù)的其他數(shù)值 (其他數(shù)值包括零),則返回FALSE。非零的自然數(shù):1,2,3.....等等。 ?
valid_email No 如果表單元素值包含不合法的email地址,則返回FALSE ?
valid_emails No 如果表單元素值中任何一個值包含不合法的email地址(地址之間用英文逗號分割),則返回FALSE。 ?
valid_ip No 如果表單元素的值不是一個合法的IP地址,則返回FALSE。 ?
valid_base64 No 如果表單元素的值包含除了base64 編碼字符之外的其他字符,則返回FALSE。 ?