6

我必须使用 Tornadoweb 作为我们现有 AngularJs 应用程序的 RESTfull 后端。

{{}} 在 Angular 应用中被大量使用。我想将来自龙卷风的角度文件作为静态文件提供

有没有办法通过 tornado 禁用处理模板以避免与 tornado 使用的 {{}} 冲突?

我知道如何使用 $interpolateProvider 更改 Angular 应用程序中的 {{}},但它会涉及 Angular 应用程序中的很多更改。

作为临时解决方案,我将 Angular 应用程序放在龙卷风的静态文件夹中并使用了重定向:

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

它正在工作,但它不是一个好的解决方案,因为显示的 url 类似于:

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

有更好的主意吗?

先感谢您

4

4 回答 4

5

使用 {{!tag}} 禁用龙卷风的翻译。

于 2013-09-21T11:42:19.000 回答
4

您可以使用 Tornado 内置的 StaticFileHandler。这会将所有内容作为静态文件传递给 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()
于 2013-12-26T19:06:37.490 回答
2

棘手且非常丑陋的解决方案:您可以只使用self.write()而不是self.render()打印文件的内容。如果它是一个 HTML 页面,那么将会有更多 .css、.js 文件和图像的 GET 请求,因此您必须有第二个处理程序才能将它们全部返回。AngularJS 应用程序示例来自:http ://architects.dzone.com/articles/angularjs-get-first-impression

项目树:

$ 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~

龙卷风代码:

#!/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()
于 2013-06-26T00:28:37.683 回答
-1

愚蠢的方式:

只需使用:

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

因为{{var1}}模板首先删除了{{ }}然后替换了,var1所以结果将{{var1}}在呈现的 html 文件中;)

于 2014-10-21T02:20:47.950 回答