一、Summarize
了解了Django Auth、知道了如何扩展User,下一步就是完成注册。这里涉及的有以下知识:
1.正则表达式
2.前后台验证
3.验证码(Python)
4.邮件激活
5.xss攻击
以上我列举的或许不完全,希望有人能提醒补充。
本期将分以上5个知识点进行系统学习!
二、正则表达式
参考学习:
正则表达式30分钟入门教程
精通 JS正则表达式
常用正则表达式
正则表达式练手
Javascript正则表达式:
文档浏览推荐:javascript正则表达式
1.创建正则表达式的两种方式
2.范围:
g
:(global)全文查找
i
:(IgnoreCase)忽略大小写
m
:(Multiline)多行查找
3.正则表达式相关的属性和方法4.字符类:
.
: IE下[^\n],其它[^\n\r] 匹配除换行符之外的任何一个字符
\d
[0-9]
匹配数字
\D
[^0-9]
匹配非数字字符
\s
[ \n\r\t\f\x0B]
匹配一个空白字符
\S
[^ \n\r\t\f\x0B]
匹配一个非空白字符
\w
[a-zA-Z0-9_]
匹配字母数字和下划线
\W
[^a-zA-Z0-9_]
匹配除字母数字下划线之外的字符
5.量词(下表量词单个出现时皆是贪婪量词)
代码 描述
*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 *
等价于{0,}
。
+
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+
等价于 {1,}
。
?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。?
等价于 {0,1}
。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
Python正则表达式:
关于Python的正则表达式参考以下:
《Python核心编程2》【有很多需要注意的地方在核心笔记中】
Python正则表达式指南【强烈推荐】
需要注意一点是:中文匹配
import re source = "s2f程序员杂志一2d3程序员杂志二2d3程序员杂志三2d3程序员杂志四2d3" u_str = source.decode('utf8') # 确保所有编码都为 unicode reg=u"[\u4e00-\u9fa5]" # 中文范围 [\u4e00-\u9fa5],使用时要 u[\u4e00-\u9fa5] 确定正则表达式也是 unicode 的 pattern = re.compile(reg) # 预编译 results = pattern.findall(u_str) for result in results : print result
三、自己项目中的一套验证程序:
js 验证:
function regCheck(type){ /* * 正则表达式匹配 * auther:BeginMan * date:2013/11/4 */ var reg = ''; if(type == 1){ //用户名校验 reg = /^[a-z0-9_\-]{2,20}$/ig }else if(type == 2){ //密码校验 reg = /^[a-z0-9_-]{6,18}$/; }else if(type == 3){ //邮箱验证 reg = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/; } return reg; }
注意,关于注册用户名这点,我参考了csdn注册,看它对用户名的处理觉得很高明。如下:
在输出中文用户名时:
var us = 表单输入的用户名; //当如何输入了中文,首先使用'aa'替换所有汉字 var nick2 = us.replace(/[\u4e00-\u9fa5]/g, 'aa'); //如果符合了验证标准 reg = /^[a-z0-9_\-]{2,20}$/ig 则us存入数据库
关于后端验证:
注意:由于我没有使用django表单,所以这些验证都需要自己写
#后台校验 pattern = re.compile(u"[\u4e00-\u9fa5]",re.M) #匹配中文 u_us = us.decode('utf8') #转换成utf8格式 if pattern.search(u_us): #如果存在汉字 nick = pattern.sub('aa',u_us) #如果出现汉字则替换成'aa' if not re.match(r'^[a-z0-9_\-]{2,20}$',nick): msg['err'] = u'用户名格式不对' return HttpResponse(json.dumps(msg,ensure_ascii=False)) else: if not us or not re.match(r'^[a-z0-9_\-]{2,20}$',us): msg['err'] = u'用户名格式不对' return HttpResponse(json.dumps(msg,ensure_ascii=False))