Builder

web application developer blog

Tornado Framework ile subdomainleri tek çatı altında geliştirme

Şu yapı kalsiktir.
Bir siteniz vardır örneğin: www.domain.com ve birde bu sitenin yönetimi için admin.domain.com sitesi varıdır.
Özünde her iki site de aynı veri tabanını kullanır ve eğer ORM kullanıyorsanız, her iki proje için de ayrı ayrı model sınıfları tanımlamanız gerekir. Tabi eğer iki projeyi tek bir proje olarak geliştirmiyorsanız.

Tornado framework, bir Python frameworküdür ve sadece bir framework değil aynı zamanda bir web application sunucusudur. Yani bu framework ile geliştrdiğiniz python uygulaması aynı zamanda bir server olacaktır. Üstelik bu server non-blocked serverdır.

Blocked ve non-blocked server kavramları başka bir yazının konusu. Bu yazımızda, tornado framework ile nasıl birden fazla domaini yöneteceğimizi yazacağım.

Routing Sınıfları

class ClientRouting:
    @staticmethod
    def get():
        return [
            # Static Files
            url(r'/assets/(.*)', StaticFileHandler, {'path': join(dirname(__file__), 'client/assets')}),
            url(r'/uploaded/(.*)', StaticFileHandler, {'path': join(dirname(__file__), 'uploaded')}),
            # Web Handlers
            url(r'/giris', LoginHandler, name="login"),
            url(r'/yeni-uye',SignupHandler, name="signup")
        ]
class AdminRouting:
    @staticmethod
    def get():
        return [
            url(r'/assets/(.*)', StaticFileHandler, {'path': join(dirname(__file__), 'admin/assets')}),
            url(r'/', AdminDefaultHandler, name="admin_home"),
            url(r'/login', AdminLoginHandler, name="admin_login"),
            url(r'/logout', AdminLogoutHandler, name="admin_logout")
        ]

Tornado Server

define('port', default=8000, help="run on the givenport", type=int)
# define('address', default='www.domain.com', help="run on the given address", type=str)


class YourApplication(tornado.web.Application):
    def __init__(self):
        setting = TornadoSettings.get()
        setting.__setitem__("ui_modules", uimodules)
        client_routing = ClientRouting.get()
        admin_routing = AdminRouting.get()
        tornado.web.Application.__init__(self, None, **setting)
        self.add_handlers(r"admin\."+YourSettings.domain_base.replace(".", r"\."), admin_routing)
        # All subdomains routing (exclude admin)
        self.add_handlers(r"[0-9a-z]*(.)?"+YourSettings.domain_base.replace(".", r"\."), client_routing)
        # Have one global connection.
        self.engine = create_engine(SqlAlchemySettings.toConnStr())
        self.db = scoped_session(sessionmaker(bind=self.engine))


if __name__ == "__main__":
    tornado.options.parse_command_line()
    application = YourApplication()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir