Tornado與pymysql的愛恨情仇
阿新 • • 發佈:2018-11-25
# tornado演示python操作資料庫【4個步驟】 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 ' \ #%s不加“”是tornado做了為了防範sql注入 'and user_password=%s' param = (name,password) #注意sql注入攻擊 # 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()