tornado入门 数据库mysql 用户注册和登陆

*安装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()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值