当一个用户要在一个论坛里发表文章时,需要先注册一个帐号,然后才可以登录进去发表文章。那么现在就来继续前一个例子,实现注册的功能。
在前面例子的基础代码之上,代码例子在下面连接:

首先要在主程序入口文件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来渲染显示,让用户输入数据,显示结果如下:


python程序注册成activex控件 python编写注册程序_python



当用户按下提交注册按钮时,就会通过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()