扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go语言Web编程

    • 课程介绍
  • Web基础

  • 表单

  • 访问数据库

  • session和数据存储

  • 文本处理

  • Web服务

  • 安全与加密

  • 国际化和本地化

  • 错误处理,调试和测试

  • 部署与维护

  • 如何设计一个Web框架

  • 扩展Web框架

    • 第1节:扩展 Web 框架
    • 第2节: 静态文件支持
    • 第3节:Session 支持
    • 第4节:表单及验证支持
    • 第5节:用户认证
    • 第6节:多语言支持
    • 第7节:pprof 支持
    • 第8节:小结

扫码订阅《 》或入驻星球,即可阅读文章!

第4节:表单及验证支持


ASTA谢

在 Web 开发中对于这样的一个流程可能很眼熟:

  • 打开一个网页显示出表单。
  • 用户填写并提交了表单。
  • 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回。
  • 用户再次填写,继续上一步过程,直到提交了一个有效的表单。

在接收端,脚本必须:

  • 检查用户递交的表单数据。
  • 验证数据是否为正确的类型,合适的标准。例如,如果一个用户名被提交,它必须被验证是否只包含了允许的字符。它必须有一个最小长度,不能超过最大长度。用户名不能与已存在的他人用户名重复,甚至是一个保留字等。
  • 过滤数据并清理不安全字符,保证逻辑处理中接收的数据是安全的。
  • 如果需要,预格式化数据(数据需要清除空白或者经过 HTML 编码等等。)
  • 准备好数据,插入数据库。

尽管上面的过程并不是很复杂,但是通常情况下需要编写很多代码,而且为了显示错误信息,在网页中经常要使用多种不同的控制结构。创建表单验证虽简单,实施起来实在枯燥无味。

# 表单和验证

对于开发者来说,一般开发过程都是相当复杂,而且大多是在重复一样的工作。假设一个场景项目中忽然需要增加一个表单数据,那么局部代码的整个流程都需要修改。我们知道 Go 里面 struct 是常用的一个数据结构,因此 beego 的 form 采用了 struct 来处理表单信息。

首先定义一个开发 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`
}
1
2
3
4
5
6
7

定义好 struct 之后接下来在 controller 中这样操作

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

在模板中这样显示表单

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

上面我们定义好了整个的第一步,从 struct 到显示表单的过程,接下来就是用户填写信息,服务器端接收数据然后验证,最后插入数据库。

func (this *AddController) Post() {
	var user User
	form := this.GetInput(&user)
	if !form.Validates() {
		return
	}
	models.UserInsert(&user)
	this.Ctx.Redirect(302, "/admin/index")
}		
1
2
3
4
5
6
7
8
9

# 表单类型

以下列表列出来了对应的 form 元素信息:

名称 参数 功能描述
text No textbox 输入框
button No 按钮
checkbox No 多选择框
dropdown No 下拉选择框
file No 文件上传
hidden No 隐藏元素
password No 密码输入框
radio No 单选框
textarea No 文本输入框

# 表单验证

以下列表将列出可被使用的原生规则

规则 参数 描述 举例
required No 如果元素为空,则返回 FALSE  
matches Yes 如果表单元素的值与参数中对应的表单字段的值不相等,则返回FALSE matches[form_item]
is_unique Yes 如果表单元素的值与指定数据表栏位有重复,则返回 False(译者注:比如 is_unique[User.Email],那么验证类会去查找 User 表中 Email 栏位有没有与表单元素一样的值,如存重复,则返回 false,这样开发者就不必另写 Callback 验证代码。) is_unique[table.field]
min_length Yes 如果表单元素值的字符长度少于参数中定义的数字,则返回 FALSE min_length[6]
max_length Yes 如果表单元素值的字符长度大于参数中定义的数字,则返回 FALSE max_length[12]
exact_length Yes 如果表单元素值的字符长度与参数中定义的数字不符,则返回 FALSE exact_length[8]
greater_than Yes 如果表单元素值是非数字类型,或小于参数定义的值,则返回 FALSE greater_than[8]
less_than Yes 如果表单元素值是非数字类型,或大于参数定义的值,则返回 FALSE less_than[8]
alpha No 如果表单元素值中包含除字母以外的其他字符,则返回 FALSE  
alpha_numeric No 如果表单元素值中包含除字母和数字以外的其他字符,则返回 FALSE  
alpha_dash No 如果表单元素值中包含除字母/数字/下划线/破折号以外的其他字符,则返回 FALSE  
numeric No 如果表单元素值中包含除数字以外的字符,则返回 FALSE  
integer No 如果表单元素中包含除整数以外的字符,则返回 FALSE  
decimal Yes 如果表单元素中输入(非小数)不完整的值,则返回 FALSE  
is_natural No 如果表单元素值中包含了非自然数的其他数值 (其他数值不包括零),则返回FALSE。自然数形如:0,1,2,3....等等。  
is_natural_no_zero No 如果表单元素值包含了非自然数的其他数值 (其他数值包括零),则返回FALSE。非零的自然数:1,2,3.....等等。  
valid_email No 如果表单元素值包含不合法的 email 地址,则返回 FALSE  
valid_emails No 如果表单元素值中任何一个值包含不合法的 email 地址(地址之间用英文逗号分割),则返回 FALSE。  
valid_ip No 如果表单元素的值不是一个合法的 IP 地址,则返回 FALSE。  
valid_base64 No 如果表单元素的值包含除了 base64 编码字符之外的其他字符,则返回 FALSE。  
  • 表单和验证
  • 表单类型
  • 表单验证