将PHP伪代码转换为Tornado/Python

2 投票
1 回答
1038 浏览
提问于 2025-04-17 14:51

我很习惯用PHP来工作——创建一个新的 .php 文件,输入所有内容,把它和一些HTML混合在一起,包含或引用不同的 .php/.html 文件等等。

我刚开始学习使用Tornado,但对Tornado的基本原理和构建方式有点搞不清楚。

为了更好地理解Tornado的工作方式(当然,除了阅读他们的文档),我想把我在PHP中熟悉的东西用Tornado重新做一遍。

比如,在PHP中,我有一个 index.php 页面。在这个页面上,我有一个 email 输入框和一个 password 输入框。当用户提交表单时,action 设置为 login.php,然后我们就会跳转到 login.php,在这里调用“登录函数”来验证用户。如果一切正常,$_SESSION 变量就会被设置,用户就登录了。如果出现错误,login.php 上会显示错误信息。

那么,在Tornado中,这个过程的“伪代码”应该是什么样的呢?

一些基本的、不太完美的Python代码:

import os

import tornado.web
import tornado.ioloop

root = os.path.dirname(__file__)
port = 8888

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

class LoginHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("login.html", title="Login to your account!")

    def post(self):
        useremail = self.get_argument("useremail", None)
        password = self.get_argument("password", None)
        self.render("login.html", title="Login to your account!")

def main():
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
        (r"/css/(.*)", tornado.web.StaticFileHandler, {"path": os.path.join(root, 'css')}),
        (r"/pictures/(.*)", tornado.web.StaticFileHandler, {"path": os.path.join(root, 'pictures')}),
    ])
    application.listen(port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

对于我这个转换的帮助非常感谢。这种做事方式和我习惯的完全不同,像这样简单过程的伪代码肯定会有很大帮助。无论如何,感谢大家。

1 个回答

-1

你可以使用react,它是一个基于事件驱动的、非阻塞的输入输出处理方式,适用于PHP。

下面是一个简单的HTTP服务器示例,它在1337端口上监听请求:

<?php

  $i = 0;

  $app = function ($request, $response) use (&$i) {
      $i++;

      $text = "This is request number $i.\n";
      $headers = array('Content-Type' => 'text/plain');

      $response->writeHead(200, $headers);
      $response->end($text);
 };

 $loop = React\EventLoop\Factory::create();
 $socket = new React\Socket\Server($loop);
 $http = new React\Http\Server($socket);

 $http->on('request', $app);

 $socket->listen(1337);
 $loop->run();

撰写回答