zoukankan      html  css  js  c++  java
  • Tornado实现简单登录注册

    1.包的路径问题

    之前我们在基础讲过怎样导入模块和包,一般我们有两种方式:

    同路径下直接:`import`或者`from packge import module`

    如果是不同路径下,需要添加路径:

    import sys
    sys.path.append('/moudule_path')

    除此之外,我们还可以使用相对路径来导入,导入方式就是在包或者模块前面加上一个或者两个点`.`来表示相对路径,其中一个点`.`表示同一个目录,两个`..`表示上一层目录,这个表示方法和Linux的路径表示是一样的。

    但是一旦在模块中使用了点来导入其他的模块,那么这个模块就是包中的一个模块,也就是说,这个模块所在的文件加,可以作为一个包来管理。

    包中的特殊文件`__init__.py`这是python的中一个比较特殊的文件,包的每一层目录都需要这个文件,这个里面的对象属性和方法,就是这个包的对象属性和方法,如:

    import xml
    dir(xml)  #这其中的__all__属性,就是定义在 __init__.py 中的

    同时,想通过点`.`来不断得到包中的包或者模块,这个文件也是必不可少的,如:

    from xml.dom import domreg

    其次,当模块中如果出现了以点`.`来导入的模块,当你写上`if __name__=='__main__'`的时候,再去执行的时候,会报错,在python2中应该是这样的报错信息:

    ValueError: Attempted relative import in non-package

    在python3中大概是这样的:

    SystemError: Parent module '' not loaded, cannot perform relative import

    这就告诉你,这个模块是包中的一个模块,但是你尝试以脚本模式执行,但是这种模式不支持相对导入。如果你需要运行,你就需要去点,换成使用`sys`来添加路径,如:

    import sys
    sys.path.append('../')
    #添加路径之后再导入模块
    import yourmodules

    最后还有一种选择导入,使用`try ...  except ...`来导入,如:

    try:
      import moduleA
    except:
      import moduleB


    在项目中由于文件过多,肯定会使用包管理来管理我们的各个模块。所以包管理是必须要知道的要点。

    在一般情况下,我们会把常用的放在最顶层的目录,或者顶层的配置文件中导入各个包或者模块。

    使用包管理的原因就是方便管理,所以我们的每个包里面是类似的相同的东西,不要随便乱放。

    2.MySQL的连接问题

    MySQL的远程连接要注意一下几点:

    2.1.首先是MySQL允许怎样的登录,是只能本地登录还是允许远程连接,这个在MySQL的配置文件中配置好的,打开`my.cnf`,如果是使用Ubuntu,那么是`/etc/mysql/mysql.conf.d`下的`mysqld.cnf`,找到`bind-address`,如果是`127.0.0.1`则代表只能本地连接,这个本地连接的意思是,先登录上Linux,然后再执行`mysql -u username -p`

    这种方式登录,改成`0.0.0.0`就允许任何IP连接了,如果改成指定的IP,那么就只有指定的IP才能登录。

    2.2.看用户是否允许远程连接。`root`用户权限太大,肯定只能允许本地连接,所以我们才新建了`admin`用户,还有`develop`用户,赋予不同的权限,同时允许这些用户远程连接。

     3.登录和注册

    首先是路由等代码如下:

    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    
    from tornado.options import define,options
    
    import util.uimodules
    import util.uimethod
    
    from data.user_modules import User,session
    
    define('port',default=8000,help='run port',type=int)
    
    class AuthError(Exception):
        def __init__(self,msg):
            super(AuthError,self).__init__(msg)
    
    class IndexHandler(tornado.web.RequestHandler):   
        def get(self):
            username = 'no'
            self.render('08sqlalchemy.html',username=username)
    
    class LoginHandler(tornado.web.RequestHandler):    #登录
        def get(self):
            self.render('08login.html',error=None)
        def post(self):
            username = User.by_name(self.get_argument('name',''))
            passwd = self.get_argument('password','')
            if username and username[0].password == passwd:
                self.render('08sqlalchemy.html',
                            username=username[0].username
                            )
            else:
                self.render('08login.html',error='登陆失败')
    
    class RegisterHandler(tornado.web.RequestHandler):   #注册
        def get(self):
            self.render('08register.html',error=None)
    
        def post(self):
            if self._check_argument():
                try:
                    self._create_user()
                    self.render('08login.html',error=None)
                except AuthError as e:
                    self.render('08register.html',error=e)
                except Exception as e:
                    self.render('08register.html',error=e)
            else:
                self.render('08register.html',error='input error')
    
        def _check_argument(self):      #对密码和用户名进行检验
            username = self.get_argument('name','')
            passwd = self.get_argument('password1','')
            if len(username)<10 and len(passwd)<10:
                return True
            else:
                return False
    
        def _create_user(self):
            if User.by_name(self.get_argument('name','')):
                raise AuthError('Name is registered')
            if self.get_argument('password1','') != self.get_argument('password2',''):
                raise AuthError('Password error')
            user = User()
            user.username = self.get_argument('name','')
            user.password = self.get_argument('password1','')
            session.add(user)
            session.commit()
    
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()
    
        app = tornado.web.Application(
            handlers=[
                (r'/',IndexHandler),
                (r'/login',LoginHandler),
                (r'/register',RegisterHandler),
            ],
            template_path='templates',
            static_path='static',
            ui_methods=util.uimethod,
            ui_modules=util.uimodules,
            debug=True,
        )
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()

    主页页面的HTML

    {% extends "./base.html" %}
    
    {% block title %} {{ username }} {% end %}
    
    
    {% block body %}
    
        {% if username!='no' %}
            欢迎用户 {{ username }} 登录
            <br>
            <img src="/static/images/c.jpg" width="250" height="250">
            <br>
        {% else %}
            {% include "./06include.html" %}
            <br>
            <img src="/static/images/b.jpg" width="250" height="250">
            <br>
        {% end %}
    
    {% end %}
    

    登录的HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Login</title>
    </head>
    <body>
    {% if error %}
        {{ error }}
    {% end %}
    
    <form method="post" action="/login">
        <p>用户名<br><input type="text" name="name"></p>
        <p>密码<br><input type="text" name="password"></p>
        <input type="submit">
    </form>
    
    </body>
    </html>

    注册的HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Register</title>
    </head>
    <body>
    
    <h1>Register</h1>
    {% if error %}
        {{ error }}
    {% end %}
    
    <form method="post" action="/register">
        <p>用户名<br><input type="text" name="name"></p>
        <p>密码<br><input type="text" name="password1"></p>
        <p>再次输入密码<br><input type="text" name="password2"></p>
        <input type="submit">
    </form>
      
    </body>
    </html>
  • 相关阅读:
    例解 Linux 下 Make 命令
    linux使用bin文件安装jdk
    Linux查看及设置系统字符集
    FTP的两种主动模式和被动模式
    Mongodb之主从复制
    Nginx配置认证登录
    AWK
    Redis+Keepalived实现高可用
    Redis哨兵配置
    Keepalived指定文件接收日志
  • 原文地址:https://www.cnblogs.com/jingqi/p/8059496.html
Copyright © 2011-2022 走看看