manage
import tornado.web
import tornado.ioloop
from tornado_jinja2 import Jinja2Loader
from app.views import RegisterHandler, LoginHandler, HomeHandler, \
ManyChatHandler, ChatHandler
# 配置 jinjia2 的模板語(yǔ)法
jinjia2loader = Jinja2Loader('templates')
def make_app():
return tornado.web.Application(handlers=[
(r'/register/', RegisterHandler),
(r'/login/', LoginHandler),
(r'/home/', HomeHandler),
(r'/many_chat/', ManyChatHandler),
(r'/chat/', ChatHandler),
],
template_path='templates',
static_path='static',
cookie_secret='adsffsadfagaioewra',
template_loader=jinjia2loader,
)
if __name__ == '__main__':
app = make_app()
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
views
import tornado.web
import tornado.websocket
from app.forms import UserRegisterForm
class RegisterHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('register.html')
def post(self, *args, **kwargs):
# 使用表單做校驗(yàn),校驗(yàn)注冊(cè)的參數(shù)長(zhǎng)度,是否為空戏罢。
form = UserRegisterForm()
if form.is_valid(self):
print(form.clean_data)
print(form.errors)
self.write('校驗(yàn)成功')
else:
print(form.errors)
self.write('校驗(yàn)失敗')
class LoginHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('login.html')
def post(self, *args, **kwargs):
form = UserRegisterForm()
if form.is_valid(self):
users = ['coco123', 'caozhihua']
if form.clean_data['account'] in users:
# 演示模擬登錄
self.set_secure_cookie('account',
form.clean_data['account'], expires_days=1)
self.redirect('/home/')
return
self.render('login.html', errors=form.errors)
class HomeHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('home.html')
class ManyChatHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('chat.html')
class ChatHandler(tornado.websocket.WebSocketHandler):
online_user = []
# 建立連接時(shí)會(huì)默認(rèn)調(diào)用的方法
def open(self, *args, **kwargs):
# 將進(jìn)入聊天室的用戶保存起來(lái)
self.online_user.append(self)
# write_message(信息)讯沈, 用于將寫(xiě)入的信息返回給前端汞斧,前端通過(guò)on_message接收
account = self.get_secure_cookie('account').decode('utf8')
for user in self.online_user:
user.write_message('系統(tǒng)提示:%s已登錄系統(tǒng)' % account)
# 前端調(diào)用send(內(nèi)容),后端調(diào)用on_message方法迎吵,用于接收前端傳遞的數(shù)
def on_message(self, message):
# 將一個(gè)用戶發(fā)送的消息廣播給進(jìn)入聊天室的用戶
for user in self.online_user:
if user != self:
# 給其他用戶廣播某個(gè)用戶發(fā)送的消息
account = self.get_secure_cookie('account').decode('utf8')
user.write_message('{}說(shuō):{}'.format(account, message))
# 退出連接時(shí)氨距,主動(dòng)調(diào)用
def on_close(self):
# 將退出聊天的用戶移除online_user
self.online_user.remove(self)
for user in self.online_user:
account = self.get_secure_cookie('account').decode('utf8')
user.write_message('系統(tǒng)提示:{}已退出系統(tǒng)'.format(account))
froms
import re
class UserRegisterForm():
def __init__(self):
# 定義校驗(yàn)字段的規(guī)則
self.account = '[0-9a-zA-Z]{5,10}'
self.password = '[0-9]{5,10}'
self.password2 = '[0-9]{5,10}'
self.errors = {}
self.clean_data = {}
def is_valid(self, request):
# 校驗(yàn)字段
flag = True
print(self.__dict__)
for key, value in self.__dict__.items():
html_value = request.get_argument(key, None)
if html_value:
# 正則匹配
if not re.match(value,html_value):
# 表示字段不符合規(guī)則
self.errors[key] = '{}字段校驗(yàn)錯(cuò)誤'.format(key)
flag = False
self.clean_data[key] = html_value
return flag