*安装torndb
pip install torndb
*安装mysql-server
创建数据库
CREATE DATABASE tornadoBlog;
注意使用python3.0时 torndb.py中要如下修改
def query(self, query, *parameters, **kwparameters):
"""Returns a row list for the given query and parameters."""
cursor = self._cursor()
try:
self._execute(cursor, query, parameters, kwparameters)
column_names = [d[0] for d in cursor.description]
# return [Row(itertools.izip(column_names, row)) for row in cursor]
return [zip(column_names, row) for row in cursor] #python3.0要修改zip方法
finally:
cursor.close()
例子
schema.sql
SET SESSION storage_engine = "InnoDB";
SET SESSION time_zone = "+8:00";
-- ALTER DATABASE CHARACTER SET "utf8";
DROP TABLE IF EXISTS entries;
CREATE TABLE entries(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
author_id VARCHAR(100) NOT NULL REFERENCES authors(name),
title VARCHAR(512) NOT NULL,
content MEDIUMTEXT NOT NULL,
updated VARCHAR(60) NOT NULL
);
DROP TABLE IF EXISTS authors;
CREATE TABLE authors(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL
);
#-*- coding: utf-8 -*-
import tornado.httpserver
import tornado.ioloop
import tornado.web
import os
import tornado.autoreload
from tornado.options import define, options
from pycket.session import SessionMixin
#1 导入
import subprocess
import torndb
import MySQLdb
define('port', default=8000, help='Run on the given port', type=int)
define('debug', default=False, help='Set debug mode', type=bool)
#1 定义选项
define('mysql_host', default='127.0.0.1', help='mysql host IP')
define('mysql_user', default='root', help='db user name')
define('mysql_password', default='kylie', help='db password')
define('mysql_database', default='tornadoblog', help='db name')
class HomeHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('index.html')
#4增加注册页面
class RegisterHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('register.html')
def post(self, *args, **kwargs):
user = self.get_argument('username')
password = self.get_argument('password')
email = self.get_argument('email')
password_c = self.get_argument('password_confirm')
print('select id from authors where name="%s"' % user)
if (not password) or (not password_c):
self.write('password is empty!')
elif not email:
self.write('email is empty')
elif not user:
self.write('name is empty')
elif password_c != password:
self.write('password is not same!')
elif self.application.db.get('select id from authors where name="%s"' % user):
self.write('user already exists')
else:
cmd = 'insert into authors (name, email, password) values("%s", "%s", "%s")' % (user, email, password)
self.application.db.execute(cmd)
self.write('Registered successfully!')
class LoginHandler(tornado.web.RequestHandler, SessionMixin):
def get(self, *args, **kwargs):
self.render('login.html')
#5 cookies和session结合数据库使用
def post(self, *args, **kwargs):
user = self.get_argument('user', None)
password = self.get_argument('password', None)
if user and password and self.application.db.get(
'select id from authors where name="%s" and password="%s"' % (user, password)):
self.set_secure_cookie('user', self.get_argument('user', None))
self.session.set('user', user)
txt = str(self.session.get('user'))
self.write('Successully set cookie!, user_session_test value: %s' % txt)
elif self.application.db.get('select id from authors where name="%s"' % user):
self.write('wrong password')
else:
self.write('please register')
class OtherHtmlHandler(tornado.web.RequestHandler):
def get_current_user(self):
user = self.get_secure_cookie('user')
print (user)
return user
@tornado.web.authenticated
def get(self, page):
pagename = page + '.html'
path = os.path.join(self.settings['static_path'], pagename)
self.render(pagename)
class CustomApp(tornado.web.Application):
def __init__(self, debug = False):
settings = {
'template_path':os.path.join(os.path.dirname(__file__), 'moban_clean/templates'),
'static_path':os.path.join(os.path.dirname(__file__), 'moban_clean'),
'blog_title': "tornado blog",
'login_url': '/login.html',
'cookie_secret':"2379874hsdhf0234990sdhsaiuofyasop977djdj",
'xsrf_cookies':True,
'debug':debug,
'pycket':{
'engine':'redis',
'storage':{
'host':'localhost',
'port': 6379,
'db_sessions':10,
'db_notifications':11,
'max_connections':2**31,
},
'cookies':{
'expires_days':2,
'expires':None, #秒
},
}
}
handles = [
(r'/$', HomeHandler),
(r'/login.html', LoginHandler),
#4增加注册页面
(r'/register', RegisterHandler),
(r'/(.+?)\.html', OtherHtmlHandler),
(r'/(.+?\..+)', tornado.web.StaticFileHandler, dict(path=settings['static_path'])),
]
super(CustomApp, self).__init__(handles, **settings)
#3实例化db, 获取mysql对象的连接
self.db = torndb.Connection(host=options.mysql_host,
database=options.mysql_database,
user=options.mysql_user,
password=options.mysql_password,
)
#2调用 创建表结构
self.create_tables()
#1 这里定义的方法,handler可直接调用
def create_tables(self):
try:
self.db.get('select count(*) from entries')
except MySQLdb.ProgrammingError:
subprocess.check_call([
'mysql',
'--host=' + options.mysql_host,
'--database=' + options.mysql_database,
'--user=' + options.mysql_user,
'--password=' + options.mysql_password
], stdin=open(os.path.join(os.path.dirname(__file__), 'schema.sql')))
if __name__ == '__main__':
tornado.options.parse_command_line()
app = CustomApp(debug=options.debug)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
#tornado.autoreload.start()
tornado.ioloop.IOLoop.instance().start()