1. 程式人生 > >Tornado與pymysql的愛恨情仇

Tornado與pymysql的愛恨情仇


# 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()