首页 > 其他分享 >[tornado]入门tornado(1): 项目结构

[tornado]入门tornado(1): 项目结构

时间:2024-02-03 16:45:06浏览次数:28  
标签:__ web 入门 项目 tornado app py port

学习资料

  1. tornado-bolierplate据说是一个适合新手入门的项目,但是已经是14年前的项目了, 使用的tornado版本是3.2(而现在tornado已经到6.4了),所以这个项目对我来说更多是学习工作流程以及项目结构
  2. iwokh blog以及这一篇2020年的博客, 时间稍微近一点

本文主要是搞清楚一个tornado app的大致结构, 通过结构出发来理解各模块的作用, 毕竟有那么多项目, 如果连结构都看不懂, 连各个模块是干嘛的, 那接下去的学习肯定更困难了

项目结构

首先从readme开始, 了解一个tornado项目的结构 (tornaod-bolierplate)

tornado-boilerplate/
    handlers/
        foo.py
        base.py
    lib/
    logconfig/
    media/
        css/
            vendor/
        js/
            vendor/
        images/
    requirements/
        common.txt
        dev.txt
        production.txt
    templates/
    vendor/
    environment.py
    fabfile.py
    app.py
    settings.py

其中涉及的一些文件的用处

网页接口的处理 - handlers (重要)

所有RequestHandler都在这里, 当environment.py执行时, pythonpath会得到相应的更新;

  • 所有handler都应该是继承自tornado.web.RequestHandler, 然后在这些handler内部重写rest的接口
# 像这样...
class HelloWorldHandlerTwo(web.RequestHandler):
	def get(self, *args, **kwargs):
		self.write("hello world---two")

tornado-boilerplate中的例子, 可以说明handler的作用

# 已创建基类
# 创建一个handler
class FooHandler(BaseHandler):
    def get(self):
        self.render("base.html")

其中渲染的base.html就是网页的主html文件, 相当于index.html的地位
handler还有更多细节, 看官方文档

  • handler中不要写同步的方法, 会被阻塞

列举地址集 - urls.py

在这里列举所有的url以及对应的handler, url的写法遵循python的正则表达式

  • r"/foo"指代所有以/foo开头的地址
url_patterns = [
    (r"/foo", FooHandler),
]

启动项目 - app.py

需要一个启动类app.py
tornado-bolierplate里的启动类是这样写的 (14年前的代码了, 其实也可以用)

#!/usr/bin/env python
import tornado.httpserver
from tornado import options, web, ioloop

from settings import settings
from urls import url_patterns
# 创建一个类继承web.Application, 并指定初始化方法
class TornadoBoilerplate(tornado.web.Application):
    def __init__(self):
        tornado.web.Application.__init__(self, url_patterns, **settings)
# 创建主入口, 首先创建对象, 然后监听动态端口
def main():
    app = TornadoBoilerplate()
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

而现在启动类的写法或许被简化了一点⬇️但逻辑是不变的

# 定义动态参数, 指定名称, 默认值, 数据类型
options.define("port", default="8888", type=int, help="端口号")
options.define("static_path", default="static", type=str, help="静态资源路径")

# 创建一个继承web.Application的对象, 传入参数, 监听动态对象
if __name__ == '__main__':
    app = web.Application(url_map, debug=True)
    app.listen(options.port)
    print('tornado, 启动')
    ioloop.IOLoop.current().start()

启动的时候就指令行输入python option_demo.py --port=8080指定端口号

lib

一些包和模块, 这些东西并不是handler, 而是一些python类和方法; 同样地, 当environment.py执行时, pythonpath会得到相应的更新

logconfig

(谷歌翻的, 太长不看系列)
该包包含一个initialize_logging方法,该方法从项目的settings.py中调用,用于设置Python的日志系统;
服务器部署的默认设置是登录到syslog, 单独开发的默认设置是简单地登录到控制台。
所有记录器都应该是应用程序根记录器的子级(在settings.py中定义)。在每个需要日志功能的文件顶部加上:

import logging
logger = logging.getLogger('five.' + __name__)

media

包含css/, js/和image/文件夹, 第三方库就放在vendor/里, 这样可以和自己打的代码分开

requirements

用到的软件/库/包的版本号

templates

存放要用到的html文件

示例代码

最后拜托AI生成一段简单代码

# 一个简单的tornado app, 需要使用配置文件里的端口号, 使用tornado-6.2
import tornado.ioloop
import tornado.web
import configparser

# Read configuration file
config = configparser.ConfigParser()
config.read('config.ini')  # Assuming a file named 'config.ini'
port = int(config['server']['port'])  # Read port from 'server' section

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world! This server is running on port " + str(port))

# 这里的方式和boilerplate是一样的
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(port)
    tornado.ioloop.IOLoop.current().start()

配置文件

[server]
port = 8888  # Replace with your desired port

将配置文件和app.py放在相同路径下, 然后指令行输入python app.py
tips

  • configparser是python自带的ini文件操作模块, 也可以在这里用来读取config.ini
  • 也可以用tornado自带的options包
from tornado.options import define, options

# Parse configuration file
options.parse_config_file("config.ini")
# inside main function
app.listen(options.port)

标签:__,web,入门,项目,tornado,app,py,port
From: https://www.cnblogs.com/Akira300000/p/17996773

相关文章

  • 如何运行vue项目
    如何运行vue项目1、首先,将项目里的“node_modules”文件夹删除,这是vue项目的依赖包。因为“node_modules”文件夹太大,一般不会打包上传到svn、git上的,所以没有这个文件夹就不用删。2、删除package-lock.json。package-lock.json记录了整个node_moudles文件夹的树状结构,还记录......
  • Python小白入门指南:从零开始掌握Python编程
    你是否曾想过用代码操控电脑、制作自动化任务,或者探索数据的奥秘?今天,我要带你进入Python的世界,为你揭开编程的神秘面纱。不论你是编程零基础,还是想学习一门新技能,这篇文章都将是你学习Python的得力助手。一、Python是什么?为什么要学Python?Python是一种高级、动态类型的编程语言,它的......
  • 一篇文章解决你的无线AP选型难题:从入门到精通
    无线网络覆盖项目中,无线AP的合理选型和部署非常重要。今天给大家安排。这篇文章,给你总结了6类典型的无线组网场所,针对每种场景的特点,给出相应的设备选型和部署的方案,同时整理了一些部署无线AP过程中容易忽略的细节,希望能给你日后组网提供一些帮助。01不同类型的AP,不同的使用环境不......
  • 算法入门:排序算法
    文章目录1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序 1.冒泡排序思想:比较相邻元素:从数组的第一个元素开始,比较相邻的两个元素,如果它们的顺序不对(比如前面的元素大于后面的元素),则交换它们的位置。一轮遍历:一轮比较和可能的交换后,最......
  • java项目启动脚本
    #!/bin/sh##javaenv##API_NAME:包名API_NAME=dsJAR_NAME=`ls$API_NAME*.jar`#PID代表是PID文件PID=$API_NAME\.pid#使用说明,用来提示输入参数usage(){echo"Usage:sh执行脚本.sh[start|stop|restart|status]"exit1}#检查程序是否在运行is_ex......
  • SpringBoot项目支持https的nacos地址
    问题描述Causedby:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget atsun.security.validator.PKIXValidator.doBuild(......
  • 延迟Promise/单项目多npm版本/webpack好处/webpack5构建速度
    《Promise.withResolvers延迟Promise》https://sorrycc.com/promise-with-resolvers/promise当被reject之后,再次resolve,都是会返回reject的消息一个npm包的多个版本webpack好处需要通过模块化的方式来开发使用一些高级的特性来加快我们的开发效率或者安全性,比如通过ES6......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1+编辑二、TimePicker组件TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示,最高精度到秒级。子组件无。接口TimePic......
  • Misc入门( 11 )
    misc31题目提示:高度是正确的,但正确的宽度是多少呢。下载附件图片,现在是看不到内容的这里和misc24的原理一样,通过bmp图片像素计算图片的宽度。还不会写脚本,直接算吧。目前图片是900*150=135000个像素大小。每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种......
  • 缓存预热是指在 Spring Boot 项目启动时
    缓存预热是指在SpringBoot项目启动时,预先将数据加载到缓存系统(如Redis)中的一种机制。那么问题来了,在SpringBoot项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢?实现方案概述在SpringBoot启动之后,可以通过以下手段实现缓存预热:使用启动监听事件实现缓存预......