Tornado-操作演示-3
阿新 • • 發佈:2018-11-12
%s 存在 inf mod web im user 數據 情感 啟動
tornado演示轉義
# tornado演示轉義 import tornado from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from tornado.options import define, options, parse_config_file from tornado.web import Application, RequestHandler # 用來響應用戶請求 class IndexHandler(RequestHandler): #響應以get方式發起的請求 def get(self, *args, **kwargs): # 服務器給瀏覽器的響應內容 self.render('escape.html',result='') #響應以post方式發起的請求 def post(self, *args, **kwargs): text = self.get_body_argument('text',None) self.render('escape.html',result = text) #定義一個變量,用來代表端口號 define('port',type=int,default=8888,multiple=False) #定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱) define('db',multiple=True,type=str,default=[]) #從指定的配置文件中,讀取port的內容 parse_config_file('config') #創建Application對象,進行若幹個對服務器的設置 #例如:路由列表,模板路徑,靜態資源路徑等 app = Application([('/',IndexHandler)],template_path='mytemplate') #創建服務器程序 server = HTTPServer(app) #服務器監聽某個端口(建議使用10000以上的端口) server.listen(options.port)#10000 #打印獲得的數據庫參數 print('數據庫參數:',options.db) #啟動服務器(在當前進程中啟動服務器) IOLoop.current().start()
tornado服務器模板使用的演示
# tornado服務器模板使用的演示 import random import tornado from os.path import join, dirname from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from tornado.options import define, options, parse_config_file from tornado.web import Application, RequestHandler # 用來響應用戶請求 class IndexHandler(RequestHandler): def initialize(self): print('initialize方法執行') #響應以get方式發起的請求 def get(self, *args, **kwargs): print('get方法執行') msg = '' s = self.get_query_argument('msg',None) if s: msg = '用戶名或密碼錯誤' # 服務器給瀏覽器的響應內容 self.render('login.html',result=msg) #響應以post方式發起的請求 def post(self, *args, **kwargs): pass def on_finish(self): print('on_finish方法執行') class LoginHandler(RequestHandler): def get(self, *args, **kwargs): pass def post(self, *args, **kwargs): name = self.get_body_argument('name',None) password = self.get_body_argument('password',None) if name=='abc' and password=='123': self.redirect('/blog') else: self.redirect('/?msg=fail') class BlogHandler(RequestHandler): def my_rand(self,a,b): return random.randint(a,b) def get(self, *args, **kwargs): self.render('blog.html',myrand=self.my_rand, blogs=[{'title':'第一篇博客', 'tag':['情感','男女','星座'], 'content':'好長好長好長的正文', 'author':'某某人', 'comment':45}, {'title':'第二篇博客', 'tag':['技術','達內'], 'content':'學好python找我就對了', 'author':'大旭旭', 'comment':0}]) def post(self, *args, **kwargs): pass #定義一個變量,用來代表端口號 define('port',type=int,default=8888,multiple=False) #定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱) define('db',multiple=True,type=str,default=[]) #從指定的配置文件中,讀取port的內容 parse_config_file('config') #創建Application對象,進行若幹個對服務器的設置 #例如:路由列表,模板路徑,靜態資源路徑等 app = Application([('/',IndexHandler), ('/login',LoginHandler), ('/blog',BlogHandler)], template_path=join(dirname(__file__),'mytemplate')) #創建服務器程序 server = HTTPServer(app) #服務器監聽某個端口(建議使用10000以上的端口) server.listen(options.port)#10000 #打印獲得的數據庫參數 print('數據庫參數:',options.db) #啟動服務器(在當前進程中啟動服務器) IOLoop.current().start()
tornado服務器在模板中使用靜態資源的演示
# tornado服務器在模板中使用靜態資源的演示 import random import tornado from os.path import join, dirname from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from tornado.options import define, options, parse_config_file from tornado.web import Application, RequestHandler, UIModule # 用來響應用戶請求 class IndexHandler(RequestHandler): def initialize(self): print('initialize方法執行') #響應以get方式發起的請求 def get(self, *args, **kwargs): print('get方法執行') # 服務器給瀏覽器的響應內容 self.render('login.html') #響應以post方式發起的請求 def post(self, *args, **kwargs): pass def on_finish(self): print('on_finish方法執行') class LoginHandler(RequestHandler): def get(self, *args, **kwargs): pass def post(self, *args, **kwargs): name = self.get_body_argument('name',None) password = self.get_body_argument('password',None) if name=='abc' and password=='123': self.redirect('/blog') else: self.redirect('/?msg=fail') class BlogHandler(RequestHandler): def my_rand(self,a,b): return random.randint(a,b) def get(self, *args, **kwargs): self.render('blog.html') def post(self, *args, **kwargs): pass class RegistHandler(RequestHandler): def get(self, *args, **kwargs): self.render('regist.html') def post(self, *args, **kwargs): pass class MyModule(UIModule): def render(self, *args, **kwargs): msg='' #uri = self.request.uri #print('uri:---->',uri) query = self.request.query print('query:--->',query) if query: msg='用戶名或密碼錯誤!' return self.render_string('module/module_login.html',result=msg) class MyBlogModule(UIModule): def render(self, *args, **kwargs): return self.render_string('module/module_blog.html',blogs=[{'title':'第一篇博客', 'tag':['情感','男女','星座'], 'content':'好長好長好長的正文', 'author':'某某人', 'avatar':'a.jpg', 'comment':45}, {'title':'第二篇博客', 'tag':['技術','達內'], 'content':'學好python找我就對了', 'author':'大旭旭', 'avatar':None, 'comment':0}]) #定義一個變量,用來代表端口號 define('port',type=int,default=8888,multiple=False) #定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱) define('db',multiple=True,type=str,default=[]) #從指定的配置文件中,讀取port的內容 parse_config_file('config') #創建Application對象,進行若幹個對服務器的設置 #例如:路由列表,模板路徑,靜態資源路徑等 app = Application([('/',IndexHandler), ('/login',LoginHandler), ('/blog',BlogHandler), ('/regist',RegistHandler)], template_path=join(dirname(__file__),'mytemplate'), static_path=join(dirname(__file__),'mystatics'), ui_modules={'mymodule':MyModule, 'myblogmodule':MyBlogModule}) #創建服務器程序 server = HTTPServer(app) #服務器監聽某個端口(建議使用10000以上的端口) server.listen(options.port)#10000 #打印獲得的數據庫參數 print('數據庫參數:',options.db) #啟動服務器(在當前進程中啟動服務器) IOLoop.current().start()
regist.html
{%extends base.html%}
{%block title%}註冊頁面{%end%}
{%block body%}
{%module mymodule()%}
{%end%}
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{%block title%}{%end%}</title>
{%block head%}{%end%}
</head>
<body>
{%block body%}{%end%}
</body>
</html>
blog.html
{%extends base.html%}
{%block title%}博客{%end%}
{%block head%}
<script src="{{static_url('js/jquery-3.2.1.js')}}"></script>
<script>
$(function () {
alert('hello');
});
</script>
{%end%}
{%block body%}
{%module myblogmodule()%}
{%end%}
escape.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>測試轉義</title>
</head>
<body>
<form method="post" action="/">
<textarea cols="25" rows="5" name="text"></textarea>
<input type="submit" value="提交">
</form>
{%raw result%}
{{result}}
</body>
</html>
login.html
{%extends base.html%}
{%block title%}登錄頁面{%end%}
{%block body%}
{%module mymodule()%}
{%end%}
tornado演示python操作數據庫
# tornado演示python操作數據庫
import random
import pymysql
import tornado
from os.path import join, dirname
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_config_file
from tornado.web import Application, RequestHandler, UIModule
# 用來響應用戶請求
class IndexHandler(RequestHandler):
def initialize(self):
print('initialize方法執行')
#響應以get方式發起的請求
def get(self, *args, **kwargs):
print('get方法執行')
# 服務器給瀏覽器的響應內容
self.render('login.html')
#響應以post方式發起的請求
def post(self, *args, **kwargs):
pass
def on_finish(self):
print('on_finish方法執行')
class LoginHandler(RequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
#利用用戶輸入的用戶名和密碼
#通過pymysql到數據庫的tb_user數據表中進行查詢
#1. 利用pymysql建立與數據庫的連接
connect = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='blogdb',
charset='utf8')
print('connect---->',connect)
#2. 通過連接獲取一個結果集
cursor = connect.cursor()
#3. 利用結果集發送SQL語句操作數據庫
sql = 'select count(*) ' 'from tb_user ' 'where user_name=%s ' 'and user_password=%s'
param = (name,password)
# where user_name="a\" or 1=1 or \("\1\"=\"1" and user_password="1\"\) or \"1\"=\"1"
print ('sql:',sql)
#cursor.execute(sql)
cursor.execute(sql,param)
#4. 利用結果集獲取數據庫返回的內容
#result = cursor.fetchall()#((數據記錄1),(數據記錄2),...)
result = cursor.fetchone()#(數據記錄1)
print('result----->',result)
if result[0]:
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
class BlogHandler(RequestHandler):
def my_rand(self,a,b):
return random.randint(a,b)
def get(self, *args, **kwargs):
self.render('blog.html')
def post(self, *args, **kwargs):
pass
class RegistHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('regist.html')
def post(self, *args, **kwargs):
pass
class MyModule(UIModule):
def render(self, *args, **kwargs):
msg=''
#uri = self.request.uri
#print('uri:---->',uri)
query = self.request.query
print('query:--->',query)
if query:
msg='用戶名或密碼錯誤!'
return self.render_string('module/module_login.html',result=msg)
class MyRegistModule(UIModule):
def render(self, *args, **kwargs):
msg = ''
return self.render_string('module/module_regist.html',result=msg)
class MyBlogModule(UIModule):
def render(self, *args, **kwargs):
return self.render_string('module/module_blog.html',blogs=[{'title':'第一篇博客',
'tag':['情感','男女','星座'],
'content':'好長好長好長的正文',
'author':'某某人',
'avatar':'a.jpg',
'comment':45},
{'title':'第二篇博客',
'tag':['技術','達內'],
'content':'學好python找我就對了',
'author':'大旭旭',
'avatar':None,
'comment':0}])
#定義一個變量,用來代表端口號
define('port',type=int,default=8888,multiple=False)
#定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱)
define('db',multiple=True,type=str,default=[])
#從指定的配置文件中,讀取port的內容
parse_config_file('config')
#創建Application對象,進行若幹個對服務器的設置
#例如:路由列表,模板路徑,靜態資源路徑等
app = Application([('/',IndexHandler),
('/login',LoginHandler),
('/blog',BlogHandler),
('/regist',RegistHandler)],
template_path=join(dirname(__file__),'mytemplate'),
static_path=join(dirname(__file__),'mystatics'),
ui_modules={'mymodule':MyModule,
'myblogmodule':MyBlogModule,
'myregistmodule':MyRegistModule})
#創建服務器程序
server = HTTPServer(app)
#服務器監聽某個端口(建議使用10000以上的端口)
server.listen(options.port)#10000
#打印獲得的數據庫參數
print('數據庫參數:',options.db)
#啟動服務器(在當前進程中啟動服務器)
IOLoop.current().start()
tornado演示通過繼承Application類添加自定義屬性, 每次使用dbutil操作數據表時,不用反復構建對象
# tornado演示通過繼承Application類添加自定義屬性
# 每次使用dbutil操作數據表時,不用反復構建對象
import hashlib
import random
import pymysql
import time
import tornado
from os.path import join, dirname
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_config_file
from tornado.web import Application, RequestHandler, UIModule
#代碼移動ALT+SHIFT+方向
from day0201.myapp.myapplication import MyApplication
from day0201.myconfig import myconfig
from day0201.myhandlers.myhandlers import IndexHandler, LoginHandler, BlogHandler, RegistHandler, CheckHandler
from day0201.mymodulers.mymodulers import MyModule, MyBlogModule, MyRegistModule
from day0201.util.dbutil import DBUtil
from day0201.util.myutils import mymd5
#創建Application對象,進行若幹個對服務器的設置
#例如:路由列表,模板路徑,靜態資源路徑等
app = MyApplication([('/',IndexHandler),
('/login',LoginHandler),
('/blog',BlogHandler),
('/regist',RegistHandler),
('/check',CheckHandler)],
tp=join(dirname(__file__),'mytemplate'),
sp=join(dirname(__file__),'mystatics'),
um={'mymodule':MyModule,
'myblogmodule':MyBlogModule,
'myregistmodule':MyRegistModule})
#創建服務器程序
server = HTTPServer(app)
#服務器監聽某個端口(建議使用10000以上的端口)
server.listen(myconfig.configs['port'])#10000
#啟動服務器(在當前進程中啟動服務器)
IOLoop.current().start()
tornado演示python操作數據庫
# tornado演示python操作數據庫
import hashlib
import random
import pymysql
import time
import tornado
from os.path import join, dirname
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_config_file
from tornado.web import Application, RequestHandler, UIModule
#代碼移動ALT+SHIFT+方向
from day0201.util.dbutil import DBUtil
from day0201.util.myutils import mymd5
# 用來響應用戶請求
class IndexHandler(RequestHandler):
def initialize(self):
print('initialize方法執行')
#響應以get方式發起的請求
def get(self, *args, **kwargs):
print('get方法執行')
# 服務器給瀏覽器的響應內容
self.render('login.html')
#響應以post方式發起的請求
def post(self, *args, **kwargs):
pass
def on_finish(self):
print('on_finish方法執行')
class LoginHandler(RequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
#利用用戶輸入的用戶名和密碼
#通過pymysql到數據庫的tb_user數據表中進行查詢
#1. 利用pymysql建立與數據庫的連接
connect = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='blogdb',
charset='utf8')
print('connect---->',connect)
#2. 通過連接獲取一個結果集
cursor = connect.cursor()
#3. 利用結果集發送SQL語句操作數據庫
sql = 'select count(*) ' 'from tb_user ' 'where user_name=%s ' 'and user_password=%s'
#對用戶輸入的登錄密碼進行md5轉碼
# md = hashlib.md5()
# md.update(password.encode('utf8'))
# pwd = md.hexdigest()
pwd = mymd5(password)
param = (name,pwd)
# where user_name="a\" or 1=1 or \("\1\"=\"1" and user_password="1\"\) or \"1\"=\"1"
print ('sql:',sql)
#cursor.execute(sql)
cursor.execute(sql,param)
#4. 利用結果集獲取數據庫返回的內容
#result = cursor.fetchall()#((數據記錄1),(數據記錄2),...)
result = cursor.fetchone()#(數據記錄1)
print('result----->',result)
if result[0]:
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
class BlogHandler(RequestHandler):
def my_rand(self,a,b):
return random.randint(a,b)
def get(self, *args, **kwargs):
self.render('blog.html')
def post(self, *args, **kwargs):
pass
class RegistHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('regist.html')
def post(self, *args, **kwargs):
#收集用戶提交的註冊信息並寫入數據庫,完成新用戶註冊
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
city = self.get_body_argument('city',None)
#判斷用戶提交必要信息是否完整
if name and password and city:
#用戶頭像文件保存在服務器磁盤上對應文件的名稱
avatar_name = None
#用戶有沒有上傳頭像
files = self.request.files
avatar = files.get('avatar',None)
if avatar:
#用戶上傳了頭像文件
#將用戶上傳的頭像文件保存
avatar_file = avatar[0]
filename = avatar_file.get('filename')
body = avatar_file.get('body')
filename = str(time.time()) + filename
writer = open('mystatics/images/%s'%filename,'wb')
writer.write(body)
writer.close()
#將保存文件的名稱賦值給avatar_name
avatar_name = filename
#將用戶信息寫入數據庫tb_user數據表
configs = {
'host':'127.0.01',
'port':3306,
'user':'root',
'password':'123456',
'database':'blogdb',
'charset':'utf8'
}
# **configs是將字典中的鍵值對自動拆分為關鍵字形式傳參
connect = pymysql.connect(**configs)
cursor = connect.cursor()
sql = 'insert into tb_user(user_name,user_password,user_city,user_avatar) values (%s,%s,%s,%s)'
#對用戶直接輸入的密碼進行md5的轉碼
#123 ---> md5格式字符串
#md = hashlib.md5()
#md.update(password.encode('utf8'))
#pwd就是將password進行md5轉碼後的結果
#pwd = md.hexdigest()
pwd = mymd5(password)
params = (name,pwd,city,avatar_name)
try:
#執行新增操作時,有可能出現用戶名重復的情況
#導致數據庫扔出異常
cursor.execute(sql,params)
#進行提交,將內容真正寫入數據表
#connect.commit()
cursor.connection.commit()
self.redirect('/')
except Exception as e:
#打印異常信息
print(e)
#print(e.__str__())
#print(type(e.__str__()))
info = e.__str__()
#(1062
m = info.split(',')[0]
#errmsg = m[1:]
errmsg = m.split('(')[1]
#/regist?msg=1062
self.redirect('/regist?msg=%s' % errmsg)
else:
self.redirect('/regist?msg=fail')
class MyModule(UIModule):
def render(self, *args, **kwargs):
msg=''
#uri = self.request.uri
#print('uri:---->',uri)
query = self.request.query
print('query:--->',query)
if query:
msg='用戶名或密碼錯誤!'
return self.render_string('module/module_login.html',result=msg)
class MyRegistModule(UIModule):
def render(self, *args, **kwargs):
msg = ''
q = self.request.query
if q:
#有問題 msg = fail msg=1062
msg = '服務器繁忙,稍後重試'
info = q.split('=')[1]
if info=='fail':
msg = '註冊信息不完整'
if info=='1062':
msg = '用戶名重復!'
return self.render_string('module/module_regist.html',result=msg)
class MyBlogModule(UIModule):
def render(self, *args, **kwargs):
return self.render_string('module/module_blog.html',blogs=[{'title':'第一篇博客',
'tag':['情感','男女','星座'],
'content':'好長好長好長的正文',
'author':'某某人',
'avatar':'a.jpg',
'comment':45},
{'title':'第二篇博客',
'tag':['技術','達內'],
'content':'學好python找我就對了',
'author':'大旭旭',
'avatar':None,
'comment':0}])
#定義一個變量,用來代表端口號
define('port',type=int,default=8888,multiple=False)
#定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱)
define('db',multiple=True,type=str,default=[])
#從指定的配置文件中,讀取port的內容
parse_config_file('config')
#創建Application對象,進行若幹個對服務器的設置
#例如:路由列表,模板路徑,靜態資源路徑等
app = Application([('/',IndexHandler),
('/login',LoginHandler),
('/blog',BlogHandler),
('/regist',RegistHandler)],
template_path=join(dirname(__file__),'mytemplate'),
static_path=join(dirname(__file__),'mystatics'),
ui_modules={'mymodule':MyModule,
'myblogmodule':MyBlogModule,
'myregistmodule':MyRegistModule})
#創建服務器程序
server = HTTPServer(app)
#服務器監聽某個端口(建議使用10000以上的端口)
server.listen(options.port)#10000
#打印獲得的數據庫參數
print('數據庫參數:',options.db)
#啟動服務器(在當前進程中啟動服務器)
IOLoop.current().start()
tornado演示利用自己封裝的dbutil工具類操作數據庫
# tornado演示利用自己封裝的dbutil工具類操作數據庫
import hashlib
import random
import pymysql
import time
import tornado
from os.path import join, dirname
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options, parse_config_file
from tornado.web import Application, RequestHandler, UIModule
#代碼移動ALT+SHIFT+方向
from day0201.util.dbutil import DBUtil
from day0201.util.myutils import mymd5
# 用來響應用戶請求
class IndexHandler(RequestHandler):
def initialize(self):
print('initialize方法執行')
#響應以get方式發起的請求
def get(self, *args, **kwargs):
print('get方法執行')
# 服務器給瀏覽器的響應內容
self.render('login.html')
#響應以post方式發起的請求
def post(self, *args, **kwargs):
pass
def on_finish(self):
print('on_finish方法執行')
class LoginHandler(RequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
dbutil = DBUtil()
if dbutil.isloginsuccess(name,password):
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
class BlogHandler(RequestHandler):
def my_rand(self,a,b):
return random.randint(a,b)
def get(self, *args, **kwargs):
self.render('blog.html')
def post(self, *args, **kwargs):
pass
class RegistHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('regist.html')
def post(self, *args, **kwargs):
#收集用戶提交的註冊信息並寫入數據庫,完成新用戶註冊
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
city = self.get_body_argument('city',None)
#判斷用戶提交必要信息是否完整
if name and password and city:
#用戶頭像文件保存在服務器磁盤上對應文件的名稱
avatar_name = None
#用戶有沒有上傳頭像
files = self.request.files
avatar = files.get('avatar',None)
if avatar:
#用戶上傳了頭像文件
#將用戶上傳的頭像文件保存
avatar_file = avatar[0]
filename = avatar_file.get('filename')
body = avatar_file.get('body')
filename = str(time.time()) + filename
writer = open('mystatics/images/%s'%filename,'wb')
writer.write(body)
writer.close()
#將保存文件的名稱賦值給avatar_name
avatar_name = filename
#將用戶信息寫入數據庫tb_user數據表
dbutil = DBUtil()
try:
#執行新增操作時,有可能出現用戶名重復的情況
#導致數據庫扔出異常
params = dict(name=name,password=password,city=city,avatar_name=avatar_name)
dbutil.registUser(**params)
self.redirect('/')
except Exception as e:
#打印異常信息
print(e)
errmsg = e.__str__()
self.redirect('/regist?msg=%s' % errmsg)
else:
self.redirect('/regist?msg=fail')
class MyModule(UIModule):
def render(self, *args, **kwargs):
msg=''
#uri = self.request.uri
#print('uri:---->',uri)
query = self.request.query
print('query:--->',query)
if query:
msg='用戶名或密碼錯誤!'
return self.render_string('module/module_login.html',result=msg)
class MyRegistModule(UIModule):
def render(self, *args, **kwargs):
msg = ''
q = self.request.query
if q:
#有問題 msg = fail msg=1062
#msg = '服務器繁忙,稍後重試'
info = q.split('=')[1]
print('info---->',info)
if info=='fail':
msg = '註冊信息不完整'
else:
msg = info
return self.render_string('module/module_regist.html',result=msg)
class MyBlogModule(UIModule):
def render(self, *args, **kwargs):
return self.render_string('module/module_blog.html',blogs=[{'title':'第一篇博客',
'tag':['情感','男女','星座'],
'content':'好長好長好長的正文',
'author':'某某人',
'avatar':'a.jpg',
'comment':45},
{'title':'第二篇博客',
'tag':['技術','達內'],
'content':'學好python找我就對了',
'author':'大旭旭',
'avatar':None,
'comment':0}])
#定義一個變量,用來代表端口號
define('port',type=int,default=8888,multiple=False)
#定義一個變量,用來代表數據庫的連接信息(用戶名,密碼,端口號,數據庫名稱)
define('db',multiple=True,type=str,default=[])
#從指定的配置文件中,讀取port的內容
parse_config_file('config')
#創建Application對象,進行若幹個對服務器的設置
#例如:路由列表,模板路徑,靜態資源路徑等
app = Application([('/',IndexHandler),
('/login',LoginHandler),
('/blog',BlogHandler),
('/regist',RegistHandler)],
template_path=join(dirname(__file__),'mytemplate'),
static_path=join(dirname(__file__),'mystatics'),
ui_modules={'mymodule':MyModule,
'myblogmodule':MyBlogModule,
'myregistmodule':MyRegistModule})
#創建服務器程序
server = HTTPServer(app)
#服務器監聽某個端口(建議使用10000以上的端口)
server.listen(options.port)#10000
#打印獲得的數據庫參數
print('數據庫參數:',options.db)
#啟動服務器(在當前進程中啟動服務器)
IOLoop.current().start()
myapplication.py
from tornado.web import Application
from day0201.util.dbutil import DBUtil
class MyApplication(Application):
def __init__(self,routers,tp,sp,um):
super().__init__(routers,template_path=tp,static_path=sp,ui_modules=um)
self.dbutil = DBUtil()
myconfig.py
configs={
'port':9999,
'db':{
'host':'127.0.0.1',
'port':3306,
'user':'root',
'password':'123456',
'database':'blogdb',
'charset':'utf8'
}
}
myhandlers.py
import random
import time
from tornado.web import RequestHandler
class IndexHandler(RequestHandler):
def initialize(self):
print('initialize方法執行')
#響應以get方式發起的請求
def get(self, *args, **kwargs):
print('get方法執行')
# 服務器給瀏覽器的響應內容
self.render('login.html')
#響應以post方式發起的請求
def post(self, *args, **kwargs):
pass
def on_finish(self):
print('on_finish方法執行')
class LoginHandler(RequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
if self.application.dbutil.isloginsuccess(name,password):
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
class BlogHandler(RequestHandler):
def my_rand(self,a,b):
return random.randint(a,b)
def get(self, *args, **kwargs):
self.render('blog.html')
def post(self, *args, **kwargs):
pass
class RegistHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render('regist.html')
def post(self, *args, **kwargs):
#收集用戶提交的註冊信息並寫入數據庫,完成新用戶註冊
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
city = self.get_body_argument('city',None)
#判斷用戶提交必要信息是否完整
if name and password and city:
#用戶頭像文件保存在服務器磁盤上對應文件的名稱
avatar_name = None
#用戶有沒有上傳頭像
files = self.request.files
avatar = files.get('avatar',None)
if avatar:
#用戶上傳了頭像文件
#將用戶上傳的頭像文件保存
avatar_file = avatar[0]
filename = avatar_file.get('filename')
body = avatar_file.get('body')
filename = str(time.time()) + filename
writer = open('mystatics/images/%s'%filename,'wb')
writer.write(body)
writer.close()
#將保存文件的名稱賦值給avatar_name
avatar_name = filename
#將用戶信息寫入數據庫tb_user數據表
try:
#執行新增操作時,有可能出現用戶名重復的情況
#導致數據庫扔出異常
params = dict(name=name,password=password,city=city,avatar_name=avatar_name)
self.application.dbutil.registUser(**params)
self.redirect('/')
except Exception as e:
#打印異常信息
print(e)
errmsg = e.__str__()
self.redirect('/regist?msg=%s' % errmsg)
else:
self.redirect('/regist?msg=fail')
class CheckHandler(RequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
username = self.get_body_argument('username',None)
print('獲取到的username:----->',username)
#利用dbutil去根據username查詢
#tb_user表中是否已有該用戶名
if self.application.dbutil.hasUser(username):
result = dict(msg='ok')
else:
result = dict(msg='no_ok')
self.write(result)
mymodulers.py
from tornado.web import UIModule
class MyModule(UIModule):
def render(self, *args, **kwargs):
msg=''
#uri = self.request.uri
#print('uri:---->',uri)
query = self.request.query
print('query:--->',query)
if query:
msg='用戶名或密碼錯誤!'
return self.render_string('module/module_login.html',result=msg)
class MyRegistModule(UIModule):
def render(self, *args, **kwargs):
msg = ''
q = self.request.query
if q:
#有問題 msg = fail msg=1062
#msg = '服務器繁忙,稍後重試'
info = q.split('=')[1]
print('info---->',info)
if info=='fail':
msg = '註冊信息不完整'
else:
msg = info
return self.render_string('module/module_regist.html',result=msg)
class MyBlogModule(UIModule):
def render(self, *args, **kwargs):
return self.render_string('module/module_blog.html',blogs=[{'title':'第一篇博客',
'tag':['情感','男女','星座'],
'content':'好長好長好長的正文',
'author':'某某人',
'avatar':'a.jpg',
'comment':45},
{'title':'第二篇博客',
'tag':['技術','達內'],
'content':'學好python找我就對了',
'author':'大旭旭',
'avatar':None,
'comment':0}])
dbuntil.py
import pymysql
from day0201.util.myutils import mymd5
class DBUtil:
def __init__(self,**kwargs):
#獲取到與數據庫的連接
#直接使用用戶傳遞的內容不太好
#應該簡單的提取
host = kwargs.get('host','127.0.0.1')
port =kwargs.get('port',3306)
user = kwargs.get('user','root')
password= kwargs.get('password','123456')
database=kwargs.get('database','blogdb')
charset = kwargs.get('charset','utf8')
#把經過提取的內容作為參數傳遞給connect方法
configs = dict(host=host,port=port,user=user,password=password,database=database,charset=charset)
conn = pymysql.connect(**configs)
#進而獲取到結果集
if conn:
self.cursor = conn.cursor()
else:
raise Exception('數據庫連接參數錯誤!')
#註冊用戶
def registUser(self,**kwargs):
name = kwargs.get('name')
password = kwargs.get('password')
pwd = mymd5(password)
city = kwargs.get('city')
avatar_name = kwargs.get('avatar_name')
sql='insert into tb_user(user_name,user_password,user_city,user_avatar) values(%s,%s,%s,%s)'
params=(name,pwd,city,avatar_name)
try:
self.cursor.execute(sql,params)
self.cursor.connection.commit()
except Exception as e:
#(1062,"Duplicat......")
#raise Exception(e.__str__())
info = e.__str__()
# (1062
m = info.split(',')[0]
# errmsg = m[1:]
errmsg = m.split('(')[1]
err='數據庫未知錯誤!'
if errmsg == '1062':
err = '用戶名重復'
raise Exception(err)
#登錄
# 根據參數中提供的用戶和密碼
# 去數據庫tb_user表中查詢是否有匹配的數據記錄
# 如果有,就返回True,否則False
def isloginsuccess(self,name,password):
sql = 'select count(*) from tb_user where user_name=%s and user_password=%s'
pwd = mymd5(password)
params = (name,pwd)
self.cursor.execute(sql,params)
result = self.cursor.fetchone()
if result[0]:
return True
else:
return False
#判定某個用戶是否存在
def hasUser(self,username):
#利用username去tb_user表查詢
# return True / False
Pass
myutils.py
import hashlib
def mymd5(orginal):
md = hashlib.md5()
md.update(orginal.encode('utf8'))
m = md.hexdigest()
return m
Tornado-操作演示-3