Soy nuevo en Tornado, y actualmente estoy tratando de superar este reciente obstáculo. Actualmente tengo definidas algunas variables de la base de datos, e instanciando los manejadores, las configuraciones y la información de conexión de la base de datos cuando inicio la clase de la Aplicación. También tengo una clase de controlador base (llamada BaseHandler) que proporciona una interfaz de base de datos simple para otras clases. Me gustaría dividir algunas de mis clases en otros archivos, y tener la mayor parte de la lógica de mi base de datos en esos otros métodos de clase, y mantener application.py para las rutas e instanciar estas otras clases cuando sea necesario, y pasar los datos necesarios a ellos para la base de datos. ¿Cómo accedería a esta función self.db desde estos otros archivos/clases?¿Cómo accedo a mis funciones de nivel de base de datos dentro de otras clases/archivos en 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
Esta lógica funciona bien cuando no se han separado de la lógica a cabo en un archivo separado, por lo Claramente estoy haciendo algo mal/extrañando algo.
¡Impresionante! Gracias por el empuje en la dirección correcta, lo aprecio. –
:). Ahora hice algunos cambios en mi código. Defino db at da.py y escribo métodos de acceso a datos en él, como 'GetKindById (self, id)'. Y no es necesario definir self.db en server.py, porque cada vez que desee usar db, puede importarlo desde da.py, o invocar métodos como 'GetKindById (self, id)' para acceder a los datos. – goofansu
Es importante tener en cuenta que tornado.database quedó en desuso durante el Tornado 2.4 días y se trasladó fuera de Tornado 3.0 al [torndb] (https://github.com/bdarnell/torndb) que ya no se mantiene y no es compatible con Python 3 – Marc