2 编写控制器

更多文章请关注: https://eightplus.github.io/

在web2py/applications/welcome/controllers目录下,是各种控制器文件,default.py是默认的控制器文件,这里我们先创建另外一个控制器文件test.py来体验下控制器的作用,内容编写如下:

#-*-coding:utf-8-*-

__author__ = 'lixiang'

def index():
    return "Hello World"

def func_test():
    return "Test web2py controllers."

 

执行python web2py.py启动服务器,然后浏览器输入:http://127.0.0.1:8000/welcome/test,结果如下图:

2 编写控制器

接着浏览器输入:http://127.0.0.1:8000/welcome/test/func_test,结果如下图:

2 编写控制器

 

了解了下控制器后,我们接着修改默认控制器文件default.py的index()函数,如图:

2 编写控制器

 

从上图可以看到一行代码:return redirect(URL('sysmanage', 'sys_manage'),所以我们需要在控制器目录下新建一个sysmanage.py文件,里面要有sys_manage函数,完整代码如下:

#系统配置
#@auth.requires_login()
def sys_manage():
    import os
    import socket,netifaces
    from collections import OrderedDict
    import fcntl
    import struct

    def get_ip_address():
        try:
            csock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            csock.connect(('8.8.8.8',80))
            (addr, port) = csock.getsockname()
            csock.close()
            return addr
        except socket.error:
            return '127.0.0.1'

    def meminfo():
        def get_meminfo():
            meminfo = OrderedDict()
            with open('/proc/meminfo') as f:
                for line in f:
                    meminfo[line.split(':')[0]] = line.split(':')[1].strip()
            return meminfo

        meminfo = get_meminfo()
        memavi = int(str(meminfo['MemAvailable'])[:-3]) / (1024.0 * 1024.0)
        meninfo = str(memavi)[0:4]
        return meninfo



    hostname = socket.gethostname()
    ip = get_ip_address()
    iplist = socket.gethostbyname_ex(hostname)
    gateway = netifaces.gateways()['default'][netifaces.AF_INET][0]
    name = netifaces.gateways()['default'][netifaces.AF_INET][1]
    for interface in netifaces.interfaces():
        if interface == name:
            macaddr = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0]['addr']
            netmask = netifaces.ifaddresses(interface)[netifaces.AF_INET][0]['netmask']

    mem = meminfo()

    form = FORM(TABLE(P(_class="divider"),
                      TR('网卡:',name
                         ),
                      TR('MAC:', macaddr
                         ),
                      TR('IP 地址:',ip
                         ),
                      TR('网关:',gateway,
                         ),
                      TR('子网掩码:',netmask,
                         ),
                      TR('网站版本:', '1.0.0',
                         ),
                      P(_class="divider"),
                      )
                )
    if form.accepts(request, session):
        redirect(URL('default','index'))
    return dict(form=form)

 

因为使用了表单,所以我们需要在applications/welcome/views/目录下新建一个对应的sysmanage目录,里面新建一个对应的sys_manage.html文件,文件内容如下:

{{extend 'layout.html'}}
<h2>系统配置
<div>
</div></h2>
<div style="width:100%;height:1px;padding:0px;background-color:#D5D5D5;overflow:hidden;"></div>
    <p></p>
{{=form}}

 

上述修改完成后,不需要重启服务器,整个过程都是热部署的,浏览器输入:http://127.0.0.1:8000/welcome/即可看到下图的效果(默认调用default.py中的index()函数):

2 编写控制器

 

如果浏览器刷新时有错误显示,可以在applications/admin/models/0.py中设置:

# if visible_apps is not empty only listed apps will be accessible

FILTER_APPS = []
将FILTER_APPS = []修改为FILTER_APPS = [welcome],即加应用的名字,设置完之后就能直接打开error tickets看错误日志了,即每次刷新浏览器如果报错,则会在/applications/welcome/errors/目录下生成一个记录报错信息的日志文件。

如果遇到报错,可能是你的系统缺失一下依赖包,可以安装如下包后再试试效果:
sudo apt-get install python-mysqldb python-netifaces python-gluon apache2 libapache2-mod-wsgi python-psycopg2 isomd5sum python-matplotlib python-reportlab mercurial