Disable template processing in Tornadoweb

ⅰ亾dé卋堺 提交于 2019-12-22 05:23:19

问题


I have to use Tornadoweb as RESTfull backend for our existing AngularJs application.

The {{}} are heavily used in the angular app. I would like to serve angular files from tornado as static files

Is there a way to disable processing templates by tornado to avoid conflicts with {{}} used by tornado?

I know how to change the {{}} in the angular app with $interpolateProvider but it will involve a lot of changes in the angular app.

As a temporary solution, I put the angular app in the static folder of tornado and used a redirect:

class IndexHandler(RequestHandler):
    def get(self):
        self.redirect(self.static_url('ng-app/index.html'),True)

It is working but it is not a nice solution because The url displayed is some thing like :

http://localhost:8080/static/ng-app/index.html?v=efb937e6a0cb0739eb0edfd88cfb4844

Any better idea?

Thank you in advance


回答1:


Use {{!tag}} to disable the translation of tornado.




回答2:


You can use Tornado's built in StaticFileHandler. This passes everything as static files to Angular:

from tornado import options, ioloop, web

options.define("port", default=8888, help="run on the given port", type=int)

SETTINGS = {
    "debug" : True
}

application = web.Application([
    (r'/(.*)', web.StaticFileHandler, {"path": "angular_app"})
],**SETTINGS)


if __name__ == "__main__":
    options.parse_command_line()
    application.listen(options.options.port)
    ioloop.IOLoop.instance().start()



回答3:


Tricky and quite ugly solution: you can just use self.write() instead of self.render() to print contents of file. If it's a HTML page, then there will be more GET requests for .css, .js files and images so you have to have second handler to return them all. Example for AngularJS application from: http://architects.dzone.com/articles/angularjs-get-first-impression

Project tree:

$ tree
.
├── angular_app
│   ├── css
│   │   ├── app.css
│   │   └── bootstrap.css
│   ├── img
│   │   └── ajax-loader.gif
│   ├── index.html
│   └── js
│       ├── app.js
│       ├── contollers
│       │   └── CurrencyConvertCtrl.js
│       ├── db.js
│       ├── models
│       │   └── Currency.js
│       ├── _references.js
│       └── vendor
│           ├── angular.js
│           ├── bootstrap.js
│           ├── highcharts.js
│           └── jquery-1.9.1.js
├── test.py
└── test.py~

Tornado code:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

import logging

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

import os 
angular_app_path=os.path.join(os.path.dirname(__file__), "angular_app")

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        with open(angular_app_path + "/index.html", 'r') as file:
            self.write(file.read())     

class StaticHandler(tornado.web.RequestHandler):
    def get(self): 
        self.set_header('Content-Type', '') # I have to set this header
        with open(angular_app_path + self.request.uri, 'r') as file:
            self.write(file.read())

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(
    handlers=[(r'/', IndexHandler), (r'/js.*', StaticHandler), (r'/cs.*', StaticHandler), (r'/img.*', StaticHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()



回答4:


dumb way:

just use:

self.render('some-template.html', var1='{{var1}}') 

since {{var1}} the template removes first the {{ }} and then replaces the var1 so the result will be {{var1}} in the rendered html file ;)



来源:https://stackoverflow.com/questions/17284286/disable-template-processing-in-tornadoweb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!