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ì đó.
Tuyệt vời! Cảm ơn bạn đã đẩy đúng hướng, tôi đánh giá cao điều đó. –
:). 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
Đ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