Jestem nowy w Tornado i obecnie próbuję ominąć ten ostatni blok. Obecnie mam zdefiniowane pewne zmienne bazy danych i uruchamiam procedury obsługi, ustawienia i informacje o połączeniu z bazą danych po zainicjowaniu klasy Application. Posiadam również podstawową klasę obsługi (o nazwie BaseHandler), która zapewnia prosty interfejs bazy danych dla innych klas. Chciałbym podzielić niektóre z moich klas na inne pliki i mieć większość logiki bazy danych w tych innych metodach klasy, a także zachować application.py dla tras i tworzyć instancję tych klas w razie potrzeby oraz przekazywać niezbędne dane do ich do bazy danych. Jak uzyskać dostęp do funkcji self.db z tych innych plików/klas?Jak uzyskać dostęp do funkcji poziomu bazy danych w innych klasach/plikach w 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
Ta logika nie działa poprawnie, gdy nie oddziela logikę się do osobnego pliku, więc Wyraźnie robię coś złego/coś brakuje.
Awesome! Dzięki za popchnięcie we właściwym kierunku, doceniam to. –
:). Teraz dokonałem pewnych zmian w moim kodzie. Definiuję db na da.py i zapisuję w nim metody dostępu do danych, takie jak 'GetKindById (self, id)'. I nie ma potrzeby definiowania self.db w serwerze .py, ponieważ za każdym razem, gdy chcesz użyć db, możesz zaimportować go z da.py lub wywołać metody takie jak 'GetKindById (self, id)' aby uzyskać dostęp do danych. – goofansu
Należy zauważyć, że tornado.database zostało wycofane podczas Tornado 2.4 dni i zostało przeniesione z Tornado 3.0 do [torndb] (https://github.com/bdarnell/torndb), które nie jest już dłużej utrzymywane i nie jest kompatybilny z Python 3 – Marc