1.包的路径问题html
以前咱们在基础讲过怎样导入模块和包,通常咱们有两种方式:python
同路径下直接:`import`或者`from packge import module`mysql
若是是不一样路径下,须要添加路径:web
import sys sys.path.append('/moudule_path')
除此以外,咱们还可使用相对路径来导入,导入方式就是在包或者模块前面加上一个或者两个点`.`来表示相对路径,其中一个点`.`表示同一个目录,两个`..`表示上一层目录,这个表示方法和Linux的路径表示是同样的。sql
可是一旦在模块中使用了点来导入其余的模块,那么这个模块就是包中的一个模块,也就是说,这个模块所在的文件加,能够做为一个包来管理。session
包中的特殊文件`__init__.py`这是python的中一个比较特殊的文件,包的每一层目录都须要这个文件,这个里面的对象属性和方法,就是这个包的对象属性和方法,如:app
import xml
dir(xml) #这其中的__all__属性,就是定义在 __init__.py 中的
同时,想经过点`.`来不断获得包中的包或者模块,这个文件也是必不可少的,如:dom
from xml.dom import domreg
其次,当模块中若是出现了以点`.`来导入的模块,当你写上`if __name__=='__main__'`的时候,再去执行的时候,会报错,在python2中应该是这样的报错信息:tornado
ValueError: Attempted relative import in non-package
在python3中大概是这样的:oop
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>