当一个用户要在一个论坛里发表文章时,需要先注册一个帐号,然后才可以登录进去发表文章。那么现在就来继续前一个例子,实现注册的功能。
在前面例子的基础代码之上,代码例子在下面连接:
首先要在主程序入口文件forum.py添加一个URL对应注册的页面,如下:
urls = (
'/', 'Index',
'/register', 'Register',
)
在这里增加了'/register', 'Register',这一行,就是实现注册类的关联,接着来创建注册类Register:
class Register:
def GET(self):
return titled_render('注册').register()
def POST(self):
try:
i = web.input()
user_id = model.User().new(i.email, i.username, i.password)
except Exception as e:
print(e)
return titled_render().failed('邮箱或帐号已存在,请重新<a href="/register">注册</a>')
else:
if user_id:
# 设置cookie
web.setcookie('user_id', str(user_id), settings.COOKIE_EXPIRES)
raise web.seeother('/user/%d' % user_id)
在注册类实现两个方法,第一个是GET方法,主要显示一个页面,让用户输入数据,不知你是否还记得前面的例子,就是它《python web py入门(5)-把网页的数据写到数据库》,实现道理是一样的。第二方法是POST,就是把页面提交的数据写到数据库。
这行代码titled_render('注册').register()是调用模板register.html来渲染显示,让用户输入数据,显示结果如下:
当用户按下提交注册按钮时,就会通过POST方法提交数据到服务器,可以使用web.input()获取相应的数据,在这里获取email地址,用户名称和密码,最后通过model中类User来添加到数据库保存。
调用new函数如下:
def new(self, email, username, password):
pwdhash = hashlib.md5(password.encode('utf-8')).hexdigest()
return db.insert('users', email=email, name=username, password=pwdhash,
picture='/static/img/user_normal.jpg', description='')
在这个函数里,先调用hashlib库的md5算法来把密码进行签名,以便从数据库里不能看出原始密码,紧跟着后面调用db.insert来执行数据库操作,把这条注册数据插入到数据库表,这样就完成了整个注册过程。如果成功注册,就打开个人信息页面。否则就会打开一个异常出错的提示(titled_render().failed),比如重复注册等等。
register.html模板:
$def with ()
<form id="register" action="" method="POST">
<table>
<tbody>
<tr>
<td><label for="email">邮箱</label></td>
<td><input type="text" id="email" name="email" /><span class="validate_tip"></span></td>
</tr>
<tr>
<td><label for="username">帐号</label></td>
<td><input type="text" id="username" name="username" /><span class="validate_tip"></span></td>
</tr>
<tr>
<td><label for="password">密码</label></td>
<td><input type="password" id="password" name="password" /><span class="validate_tip"></span></td>
</tr>
<tr>
<td><label for="password_again">密码确认</label></td>
<td><input type="password" id="password_again" name="password_again" /><span class="validate_tip"></span></td>
</tr>
<tr><td><input type="submit" id="register_btn" value="注册" /></td></tr>
</tbody>
</table>
</form>
failed.html模板文件如下:
$def with (error)
<p>$:error</p>
forum.py文件:
#python 3.6
#蔡军生
#
#
import web
import settings
import model
import util
import os
import json
import hashlib
urls = (
'/', 'Index',
'/register', 'Register',
)
#
app = web.application(urls, globals(), autoreload = True)
##### BEG: 模板渲染 #####
curdir = os.path.abspath(os.path.dirname(__file__))
templates = curdir + '/templates/'
def render(params={}, partial=False):
global_vars = {**settings.GLOBAL_PARAMS, **params}
if partial:
return web.template.render(templates, globals=global_vars)
else:
return web.template.render(templates, base='layout', globals=global_vars)
def titled_render(subtitle=''):
subtitle = subtitle + ' - ' if subtitle else ''
return render({'title': subtitle + settings.SITE_NAME, 'make_html': util.make_html,
'trim_utf8': util.trim_utf8, 'menu': util.menu(model.User())})
##### END: 模板渲染 #####
class Index:
def GET(self):
i = web.input(page='1')
page = int(i.page)
page_posts, page_count = model.Post().list(page)
return titled_render().list(page_posts, page_count, page)
class Register:
def GET(self):
return titled_render('注册').register()
def POST(self):
try:
i = web.input()
user_id = model.User().new(i.email, i.username, i.password)
except Exception as e:
print(e)
return titled_render().failed('邮箱或帐号已存在,请重新<a href="/register">注册</a>')
else:
if user_id:
# 设置cookie
web.setcookie('user_id', str(user_id), settings.COOKIE_EXPIRES)
raise web.seeother('/user/%d' % user_id)
# 导出的wsgi函数
application = app.wsgifunc()
##### 调试 #####
if __name__ == "__main__":
app.run()