Skip to content

Instantly share code, notes, and snippets.

@hondajojo
Created May 18, 2015 13:23
Show Gist options
  • Save hondajojo/5d762b801f859fb0d8d6 to your computer and use it in GitHub Desktop.
Save hondajojo/5d762b801f859fb0d8d6 to your computer and use it in GitHub Desktop.
login-logout-signup by tornado
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import torndb
from tornado.options import define,options
import bcrypt
import concurrent.futures
from tornado import gen
import tornado.escape
define("port",default=8001,help='run on the given port',type=int)
define('mysql_host',default='127.0.0.1:3306',help='db host')
define('mysql_database',default='tot',help='db name')
define('mysql_user',default='root',help='db user')
define('mysql_password',default='1',help='db password')
executor = concurrent.futures.ThreadPoolExecutor(2)
TEMPLATE_PATH = os.path.join(os.path.dirname(__file__), "templates")
STATIC_PATH = os.path.join(os.path.dirname(__file__), "static")
class Application(tornado.web.Application):
def __init__(self):
handlers = [
# (r'/index',loginHandler),
(r'/login',LoginHandler),
(r'/',HomeHandler),
(r'/logout',LogoutHandler),
(r'/register',RegisterHandler),
]
settings = dict(
template_path = TEMPLATE_PATH,
static_path = STATIC_PATH,
debug = True,
cookie_secret = 'bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=',
login_url = '/login',
)
tornado.web.Application.__init__(self,handlers,**settings)
self.db = torndb.Connection(
host = options.mysql_host,
database = options.mysql_database,
user = options.mysql_user,
password = options.mysql_password,
)
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie('username')
class HomeHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render('home.html')
class LoginHandler(BaseHandler):
def get(self):
db = self.application.db
#first = db.query('select * from users')
#print first
self.render('denglu.html',error=None)
#class loginHandler(tornado.web.RequestHandler):
@gen.coroutine
def post(self):
name = self.get_argument('username')
password = self.get_argument('password')
# hashed_password = yield executor.submit(
# bcrypt.hashpw, tornado.escape.utf8(self.get_argument("password")),
# bcrypt.gensalt())
#email = self.get_argument('email')
db =self.application.db
check_result = self.check(name,password)
#print check_result
if isinstance(check_result,dict):
hashed_password = yield executor.submit(
bcrypt.hashpw, tornado.escape.utf8(password),
tornado.escape.utf8(check_result['password']))
if hashed_password == check_result['password']:
self.set_secure_cookie('username',name)
self.redirect('/')
else:
self.render('denglu.html',error='密码错误')
#self.render('shouye.html')
#self.render('index.html')
#db.insert("insert into users (username,password) values (%s,%s)",name,passwd)
#self.set_secure_cookie('username',self.get_argument('username'))
#self.redirect('/')
#elif check_result == 2:
#self.render('denglu.html',error='密码错误')
elif check_result == 3:
#db.insert("insert into users (username,password,email) values (%s,%s,%s)",name,passwd,email)
#self.render('shouye.html',name=name)
self.render('denglu.html',error='用户名不存在')
# elif check_result == 4:
# self.render('denglu.html',error='请输入用户名')
# elif check_result == 3:
# self.render('denglu.html',error='用户名不存在')
else:
self.render('denglu.html',error='请输入完整')
#else:
#self.write('请输入用户名和密码')
#db.execute("insert into users (username,password,email) values (%s,%s,%s)",name,passwd,email)
#self.redirect('/')
#self.redirect('/')
def check(self,name,password):
db = self.application.db
all = db.query('select * from users')
#if name in [i['username'] for i in all] and passwd in [i['password'] for i in all]:
if name and password:
if name in [i['username'] for i in all ]:
sql = 'select * from users where username="%s"' %name
db_name = db.get(sql)
# if db.get(sql)['password'] == password:
# return 1
# else: return 2
return db_name
else: return 3
else: return 4
class LogoutHandler(BaseHandler):
def get(self):
self.clear_cookie('username')
self.redirect(self.get_argument('next','/'))
class RegisterHandler(BaseHandler):
def get(self):
self.render('register.html',error=None)
@gen.coroutine
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
email = self.get_argument('email')
db = self.application.db
check_register_result = self.check_register(username,password,email)
if check_register_result == 1:
hashed_password = yield executor.submit(
bcrypt.hashpw,tornado.escape.utf8(password),bcrypt.gensalt()
)
db.insert("insert into users (username,password,email) values (%s,%s,%s)",username,hashed_password,email)
self.set_secure_cookie('username',username)
self.redirect('/')
elif check_register_result == 2:
self.render('register.html',error='该邮箱注册过')
elif check_register_result == 3:
self.render('register.html',error='用户名已被注册')
else:
self.render('register.html',error='请输入完整')
def check_register(self,username,password,email):
db = self.application.db
all = db.query('select * from users')
if username and password and email:
if username not in [i['username'] for i in all ]: #用户名在数据库里没有
if email not in [i['email'] for i in all ]: return 1 #都没有
else: return 2 #邮箱存在,用户名不存在
else: return 3 #用户名在数据库里有,已存在
# elif:
# if username and password: return 4 #输入邮箱
# elif username and email: return 5 #输入用户名
# elif password and email: return 6 #输入密码
else:
return 4
if __name__ == "__main__":
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
@LunaAugust
Copy link

Please include HTML sir. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment