2012-04-01 7 views
7

Tôi là người mới đến Tornado, và tôi hiện đang cố gắng vượt qua khối cản trở gần đây này. Hiện tại tôi có một số biến cơ sở dữ liệu được định nghĩa và tôi khởi tạo các trình xử lý, cài đặt và thông tin kết nối cơ sở dữ liệu khi tôi khởi tạo lớp Ứng dụng. Tôi cũng có một lớp trình xử lý cơ sở (có tên BaseHandler) cung cấp một giao diện cơ sở dữ liệu đơn giản cho các lớp khác. Tôi muốn chia một số lớp của tôi thành các tệp khác và có hầu hết logic cơ sở dữ liệu của tôi trong các phương thức lớp khác và giữ cho application.py cho các tuyến đường và khởi tạo các lớp khác khi cần và chuyển các dữ liệu cần thiết đến chúng cho cơ sở dữ liệu. Làm cách nào để truy cập chức năng self.db này từ bên trong các tệp/lớp khác này?Làm cách nào để truy cập các chức năng cấp cơ sở dữ liệu của tôi bên trong các lớp/tệp khác trong Tornado?

application.py:

import tornado.database 
import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 

from tornado.options import define, options 
from user import User 

# Define some startup settings, can be changed through the command line 
define("port", default=8888, help="Run on the given HTTP port", type=int) 
define("db_host", default="localhost:3306", help="Database host") 
define("db_name", default="database_name", help="Database name") 
define("db_user", default="user", help="Database username") 
define("db_pass", default="password", help="Database password") 

class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", MainHandler) 
     ] 
     settings = dict(
      application_title = u"Test Application", 
      template_path = os.path.join(os.path.dirname(__file__), "templates"), 
      static_path = os.path.join(os.path.dirname(__file__), "static"), 
      autoescape = None 
     ) 
     tornado.web.Application.__init__(self, handlers, **settings) 

     self.db = tornado.database.Connection(
      host=options.db_host, database=options.db_name, 
      user=options.db_user, password=options.db_pass) 

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     return self.application.db 

class MainHandler(BaseHandler): 
    def get(self): 
     u = User() 
     self.write(tornado.escape.json_encode(u.get_user("[email protected]))) 

user.py:

class User(object): 
    def get_user(self, email): 
     result = self.db.get("SELECT first_name, last_name FROM users WHERE email = %s", email) 
     if not result: return False 
     return True, result 

Logic này không hoạt động tốt khi tôi đã không tách logic ra vào một tập tin riêng biệt, vì vậy Tôi đang làm điều gì đó sai/thiếu một cái gì đó.

Trả lời

10

Tôi gặp tình huống tương tự vừa rồi, sau đó tôi xem một số ví dụ về github và thực hiện điều đó.

tôi tách tập tin của tôi như:

  • server.py: chạy ứng dụng
  • urls.py: xác định những người thuận tay và ui_modules
  • da.py: xác định phương pháp hữu ích để truy cập dữ liệu

Sau đây là một số tóm tắt của mỗi tệp, tôi nghĩ điều này có thể giúp bạn giải quyết vấn đề của mình.

urls.py

import main 
import topic 

handlers=[] 
handlers.extend(main.handlers) 
handlers.extend(topic.handlers) 

ui_modules={} 

da.py

nhập khẩu tornado.database

from tornado.options import define,options 
define("mysql_host", default="127.0.0.1:3306", help="database host") 
define("mysql_database", default="forum", help="database name") 
define("mysql_user", default="root", help="database user") 
define("mysql_password", default="111111", help="database password") 

db = tornado.database.Connection(
    host=options.mysql_host, database=options.mysql_database, 
    user=options.mysql_user, password=options.mysql_password) 

server.py

import os 
import tornado.database 
import tornado.httpserver 
import tornado.ioloop 
import tornado.web 

from tornado.options import define, options 
define("port", default=8888, help="run on the given port", type=int) 

import da 

class Application(tornado.web.Application): 
    def __init__(self): 
     from urls import handlers,ui_modules 
     settings = dict(
      template_path=os.path.join(os.path.dirname(__file__), "templates"), 
      static_path=os.path.join(os.path.dirname(__file__), "static"), 
      xsrf_cookies=True, 
      cookie_secret="11oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=", 
      login_url="/signin", 
      ui_modules=ui_modules, 
      debug=True, 
     ) 
     super(Application,self).__init__(handlers,**settings) 
#  tornado.web.Application.__init__(self, handlers, **settings) 
     # Have one global connection to the blog DB across all handlers 
     self.db = da.db 

def runserver(): 
    tornado.options.parse_command_line() 
    http_server = tornado.httpserver.HTTPServer(Application()) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 

if __name__ == "__main__": 
    runserver() 

Bạn có thể sử dụng db chỉ 'từ da import * 'và sau đó mọi thứ diễn ra tốt, hoặc bạn có thể viết một BaseHandler kéo dài tornado.web.RequestHandler và xác định một tài sản:

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     return self.application.db 

Mỗi handler mà kéo dài BaseHandler có thể sử dụng self.db để làm hoạt động cơ sở dữ liệu sau đó.

+0

Tuyệt vời! Cảm ơn bạn đã đẩy đúng hướng, tôi đánh giá cao điều đó. –

+0

:). Bây giờ tôi đã thực hiện một số thay đổi trong mã của mình. Tôi định nghĩa db tại da.py và viết các phương thức truy cập dữ liệu trong nó như 'GetKindById (self, id)'. Và không cần phải định nghĩa self.db trong server.py, bởi vì mỗi khi bạn muốn sử dụng db, bạn có thể nhập nó từ da.py, hoặc gọi các phương thức như 'GetKindById (self, id)' để truy cập dữ liệu. – goofansu

+0

Điều quan trọng cần lưu ý là tornado.database đã không được dùng lại trong Tornado 2.4 ngày và đã được chuyển ra khỏi Tornado 3.0 vào [torndb] (https://github.com/bdarnell/torndb) mà không được duy trì lâu hơn nữa và không tương thích với Python 3 – Marc