2012-04-01 14 views
7

Tornado'da yeniyim ve şu anda bu yeni engelle karşılaşmaya çalışıyorum. Şu anda bazı veritabanı değişkenleri tanımlanmış ve Uygulama sınıfını başlattığımda işleyicileri, ayarları ve veritabanı bağlantı bilgilerini başlatıyorum. Ayrıca, diğer sınıflara basit bir veritabanı arabirimi sağlayan bir temel işleyici sınıfı (BaseHandler adlı) var. Sınıflarımın bir kısmını diğer dosyalara bölmek ve diğer sınıf yöntemlerinde veritabanı mantığımın çoğuna sahip olmak ve rotalar için application.py'yi tutmak ve gerektiğinde bu diğer sınıfları başlatmak ve gerekli verileri iletmek istiyorum. veritabanı için onları. Bu self.db işlevine diğer dosya/sınıflardan nasıl erişirim?Veritabanı düzey işlevlerime Tornado'daki diğer sınıflar/dosyalar içinde nasıl erişirim?

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 

Ben ayrı dosyaya dışarı mantığı ayrılmış hallerdeki mantık yüzden, ince işliyor Açıkçası bir şeyleri yanlış/eksik yapıyorum.

cevap

10

Şimdi aynı durumla karşılaşıyorum, o zaman github ile ilgili bazı örnekleri görüyorum ve bunu yaptım.

ben gibi dosyalarımı ayırmak:

  • server.py: çalıştırma uygulaması
  • urls.py: elini tanımlayabilir ve
  • da.py ui_modules: veri erişimi için yararlı yöntemlerini tanımlamak

Her dosyanın bir kısmı aşağıda açıklanmıştır; bu, sorununuzu çözmenize yardımcı olabileceğini düşünüyorum.

urls.py

import main 
import topic 

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

ui_modules={} 

da.py

ithalat

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() 
Sen dekar dan' sadece db kullanabilirsiniz

server.py

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) 

tornado.database import * 've sonra her şey gider kuyu veya bir BaseHandler tornado.web.RequestHandler uzanır yazıp bir özellik tanımlayabilirsiniz:

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

BaseHandler sonra veritabanı işlemleri yapmak self.db kullanabilirsiniz uzanır Her işleyici.

+0

Awesome! Doğru yönde ilerlediğiniz için teşekkür ederim. –

+0

:). Şimdi kodumda bazı değişiklikler yaptım. Db'yi da.py'de tanımlarım ve veri erişim yöntemlerini 'GetKindById (self, id)' gibi yazdım. Ve self.db'yi server.py içinde tanımlamanıza gerek yoktur, çünkü db'yi kullanmak istediğiniz her zaman, onu da.py'den içe aktarabilir veya verilere erişmek için 'GetKindById (self, id)' gibi yöntemleri çağırabilirsiniz. – goofansu

+0

Tornado 2.4 gün boyunca tornado.database'in kullanımdan kaldırıldığını ve Tornado 3.0'ın artık kullanılmadığı [torndb] 'a (https://github.com/bdarnell/torndb) taşındığını unutmamak önemlidir. Python 3 ile uyumlu değil – Marc

İlgili konular