Tornado中可能遇到的问题

Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。


1.遇到 404 的时候能够触发我自己声明的 write_error 函数,然而 write_error 并没有生效,输出的是 tornado 默认的 404 页面。

解决方案:RequestDispatcher 在没有找到 handler 默认设置将 handler 为 ErrorHandler,
如果指定了 default_handler_class ,就使用 default_handler_class 。
说白了 404 错误就是路由不匹配,
可以看到 ErrorHandler 继承自 RequestHandler 而并非自定义的 BaseHandler 类
所以即使你在 BaseHandler 中定义了 write_error 方法, ErrorHandler 中也不会有 write_error 的处理逻辑

2.网络异常重启引起的 TorMySQL 的并发过高,失去平缓峰值的作用。导致峰值直接击穿 MySQL

解决方案:
1.调低了连接池最大连接数
2.做几台主从,读写分离
3.在tornado中加了一个hook,在重启前add_reload_hook中增加了一个release的函数

    def release():
    from lib.query import _mysql_server
    for key in _mysql_server:
        db = _mysql_server[key]
        db.close()

    def run():
        application_settings = {
            'handlers': urls,
            'debug': DEBUG,
        }
        application = tornado.web.Application(**application_settings)
        options.parse_command_line()

        init_log(options.log_dir)
        application.listen(options.port)
        io_loop = tornado.ioloop.IOLoop.instance()

        # 这段代码是解决autoreload造成连接数没有断开的问题
        tornado.autoreload.add_reload_hook(release)
        tornado.autoreload.start(io_loop)

        io_loop.start()

URL:https://www.v2ex.com/t/262338

3.使用了代理后发现获取到的IP是127.0.0.1或是服务器端IP

解决方案:

Tornado支持通过x-real-ip或x-forwarded-for来获取IP,
        但前提是需要在你的HTTPServer实例中增加xheaders=True参数
        http_server = HTTPServer(Application(), xheaders=True) 
        或 application.listen(8080, xheaders=True)
        nginx配置x-forwarded-for时只需在反向代理规则中增加一行:
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

4.在settings里面配置好static_path后,编写代码这样是没有问题的,图片可以正常显示。但是如果图片属性是在单独的css文件中定义了,background: url(‘{{static_url(“img/button_go.gif”)}}’) repeat-x left top; 就不行.

解决方案:CSS只是被HTML文件引用,是在用户的浏览器上被载入,
没有经过tornado模板引擎的处理,{{static_url(“img/button_go.gif”)}}是不会被转换成文件的实际地址的。
直接设置 相对路径 ,或避免css文件中出现image属性


青冥有晓月

<think>好的,用户想在openEuler系统上安装Python的Tornado框架。首先,我需要回忆一下安装Python包的一般方法,通常使用pip。不过,用户的操作系统是openEuler,可能需要考虑一些特定的依赖或兼容性问题。 首先,我应该检查用户提供的引用内容,看看有没有相关的安装步骤。查看引用[1]和引用[2],里面提到了安装Tornado的命令,比如在引用[1]中有“pip3 install tornado”,引用[2]同样提到了“pip install tornado”。这说明在之前的文档中,安装Tornado是通过pip直接安装的,可能不需要额外的步骤。 不过,用户的环境是openEuler,这可能是一个基于Linux的发行版,需要注意系统自带的Python版本和pip是否已经安装。可能需要先安装pip,或者确保Python3的环境正确配置。比如,用户可能需要运行sudo dnf install python3-pip来安装pip3,如果还没有的话。 另外,引用中提到安装其他依赖包,比如pyyaml、numpy等,但用户的问题只涉及Tornado,所以可能不需要这些。不过,考虑到Tornado本身可能有依赖,但通常pip会自动处理。不过,有些系统包可能需要先安装,比如gcc或python3-devel,用于编译某些依赖项。例如,如果Tornado有C扩展,可能需要这些开发工具。 因此,步骤应该是先确保pip3可用,然后直接通过pip安装Tornado。如果遇到问题,再安装系统依赖。此外,建议用户创建虚拟环境,避免全局安装,这符合Python的最佳实践。 另外,用户提供的引用[3]提到了Tornado在webui中的使用,可能用户是在部署某个Web应用,比如与生成图片相关的服务可能需要检查Tornado的版本是否兼容其他组件,比如protobuf等。但用户的问题仅涉及安装,暂时不需要考虑这些。 总结步骤:1. 安装pip3(如果需要);2. 使用pip3安装Tornado;3. 验证安装。可能还需要处理依赖问题,如安装gcc等。</think>### 如何在 openEuler 系统中安装 Python Tornado 框架 #### 步骤 1:确保 Python 和 pip 环境可用 openEuler 系统默认可能未安装 Python3 和 pip,需先验证环境: ```bash python3 --version # 查看 Python3 版本 pip3 --version # 查看 pip3 是否安装 ``` 若未安装 pip3,通过以下命令安装: ```bash sudo dnf install python3-pip # 使用 dnf 包管理器安装 pip3 ``` #### 步骤 2:安装 Tornado 框架 直接通过 pip3 安装 Tornado(推荐使用虚拟环境): ```bash pip3 install tornado # 安装最新稳定版,引用[1][2]中均包含此命令 ``` #### 步骤 3:验证安装 创建测试脚本 `test_tornado.py`: ```python import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Tornado 安装成功!") def make_app(): return tornado.web.Application([(r"/", MainHandler)]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 运行脚本后访问 `http://localhost:8888`,若显示文本则安装成功。 #### 可能遇到的问题与解决 1. **依赖缺失**: 若安装时报错提示编译依赖(如 `gcc`),需安装开发工具: ```bash sudo dnf install gcc python3-devel ``` 2. **版本冲突**: 若需特定版本,可通过 `pip3 install tornado==x.x.x` 指定版本号[^1][^2]。 3. **虚拟环境隔离**: 建议使用虚拟环境避免污染系统环境: ```bash python3 -m venv myenv source myenv/bin/activate pip3 install tornado ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值