分享 Zephyr : 用 tornado 重写以前一个 flask 的煎蛋博客网站

2015-11-01 12:48:41 +08:00
 lianghui

Zephyr 连接地址:
https://github.com/whiteclover/Zephyr

一些改进:

前端能力有限,没有变动,勿吐槽。适合新手学习,有兴趣的可以 fork 自己改造。

以前 flask 版本

https://github.com/whiteclover/white

$ python zephyrd -h

usage: zephyrd [-h] [--asset.url_prefix ASSET.URL_PREFIX]
               [--asset.path ASSET.PATH] [--db.db DB.DB] [--db.host DB.HOST]
               [--db.user DB.USER] [--db.passwd DB.PASSWD] [--db.port DB.PORT]
               [--jinja2.cache_path JINJA2.CACHE_PATH]
               [--jinja2.cache_size JINJA2.CACHE_SIZE] [--jinja2.auto_reload]
               [--redis.host REDIS.HOST] [--redis.port REDIS.PORT]
               [--redis.db REDIS.DB] [--redis.password REDIS.PASSWORD]
               [--redis.max_connections REDIS.MAX_CONNECTIONS]
               [-H TORNADO.HOST] [-p TORNADO.PORT] [-d] [--language LANGUAGE]
               [--theme THEME] [--secert_key SECERT_KEY] [-c FILE]
               [-v VERSION]

optional arguments:
  -h, --help            show this help message and exit

Asset settings:
  --asset.url_prefix ASSET.URL_PREFIX
                        Asset url path prefix: (default '/assets/')
  --asset.path ASSET.PATH
                        Asset files path (default
                        '/code/Zephyr/zephyr/asset')

DB settings:
  --db.db DB.DB         The database name (default 'zephyr')
  --db.host DB.HOST     The host of the database (default 'localhost')
  --db.user DB.USER     The user of the database (default 'zephyr')
  --db.passwd DB.PASSWD
                        The password of the database (default 'zephyr')
  --db.port DB.PORT     The port of the database (default 3306)

Jinja2 settings:
  --jinja2.cache_path JINJA2.CACHE_PATH
                        Jinja2 cache code byte path: (default None)
  --jinja2.cache_size JINJA2.CACHE_SIZE
                        Jinja2 cache size: (default -1)
  --jinja2.auto_reload  Jinja2 filesystem checks (default False)

Redis settings:
  --redis.host REDIS.HOST
                        The host of the redis (default 'localhost')
  --redis.port REDIS.PORT
                        The port of the redis (default 6379)
  --redis.db REDIS.DB   The db of the redis (default 0)
  --redis.password REDIS.PASSWORD
                        The user of the redis (default None)
  --redis.max_connections REDIS.MAX_CONNECTIONS
                        The max connections of the redis (default None)

Service settings:
  -H TORNADO.HOST, --tornado.host TORNADO.HOST
                        The host of the tornado server (default 'euterpe')
  -p TORNADO.PORT, --tornado.port TORNADO.PORT
                        The port of the tornado server (default 8888)
  -d, --debug           Open debug mode (default False)
  --language LANGUAGE   The language for the site (default 'en_GB')
  --theme THEME         The theme for the site (default 'default')
  --secert_key SECERT_KEY
                        The secert key for secure cookies (default
                        '7oGwHH8NQDKn9hL12Gak9G/MEjZZYk4PsAxqKU4cJoY=')
  -c FILE, --config FILE
                        config path (default '/etc/zephyr/app.conf')
  -v VERSION, --version VERSION
                        Show zephyr version 0.1.0a

Setup Config file

Currently, using hocon config. the primary goal of hocon is: keep the semantics (tree structure; set of types; encoding/escaping) from JSON, but make it more convenient as a human-editable config file format.

# Zehpyr config


tornado {
        host = "localhost"
        port = 8888
}

# theme = "default"
# languge = "en_GB"

secert_key = "7oGwHH8NQDKn9hL12Gak9G/MEjZZYk4PsAxqKU4cJoY="

debug = off

db {
        passwd = "thomas"
    user = "root"
    host = "localhost"
    db = "zephyr"
}


redis {
        host = "localhost"
        port = 6379
}

//asset {
//      url_prefix = "/assets/" // asset url path prefix
//      path  = "./nodejs/dist/assets" # static files path
//}


jinja2 {
        cache_path = "./cache" # mako module cache  path, comments it if wanna  disable
        auto_reload = on
}
3202 次点击
所在节点    Python
7 条回复
jodoo
2015-11-01 17:21:37 +08:00
谢谢分享!对于我这种总是偏执于研究一种轮子的不同实现方法的人来说,很有参考价值。;-)
sujin190
2015-11-01 20:33:38 +08:00
完全没用 tornado 的异步啊?
lianghui
2015-11-01 21:14:08 +08:00
@jodoo 关键是找到更好的解决方法

@sujin190 你是说那个 wsgi cherrypy server 的包裹, 如果要说异步,应该是在 tornado 的 http io 层是异步的, 其他数据库都不是异步的,如果要做异步 mapper 层和 session 都要重写,另外架构结构也不会是现在这样了。这些没有重数据库的请求,加上 cache 层,前面挂 nginx 后面 tornado app perfork 不是挺好吗
fire5
2015-11-02 10:54:17 +08:00
@lianghui 没有到异步虽然没用到 tornado 的核心特性。不过项目开发来说 没有什么大问题。
mulog
2015-11-02 18:17:47 +08:00
请问用 tornado 重写和和以前用 flask 相比有啥感受?
lianghui
2015-11-02 21:33:20 +08:00
@fire5 绝对看过 tornado 开发者的观点 ,赞同 https://github.com/tornadoweb/tornado/wiki/Threading-and-concurrency

1) Do it synchronously and block the IOLoop. This is most appropriate for things like memcache and database queries that are under your control and should always be fast. If it's not fast, make it fast by adding the appropriate indexes to the database, etc.

@mulog Tornado 提供的一个异步 io 底层库和潦草不多的外层异步库支持,所以也没怎么考虑使用异步 io 数据操作库。 简单的 web 核心 拓展起来比较自由, 个人工作上的项目风格都是面向对象的,现在主要使用 java/scala 做日常工作,所以写的 oo 风格更为习惯一点。 另外令人费解的有人天天吐槽 tornado 为什么不用异步的 io 库或者又没好使的异步数据库 io 库,如果写一些无数据库 io 的异步服务 tornado 绝对是首选。为何就没人吐槽 flask 的 thread local 的线程本地变量隔离机制。 flask 绝对适合上手,拓展性还不错。 同样 tornado 也非常适合上手,但是拓展的话,需要一些时间定制化。

flask 的拓展被开发者给了一个规范,但不等同于那些拓展都是你需要的,或者能满足你或者需求。 flask 路由上语法糖,相比 routes 那个库,还是觉得 routes 的更为方便点。在 zephyr 开发中加了一些简化命名 url 参数的工具,个人还是习惯像 django 那样把 url 入口写在一块。 zephyr 使用不少 字符串命名惯例 以便实现自动绑定,另方面解决 flask 多人开发造成个别文件被不同开发者修改的一些冲突。 最主要的能够使用更多面向对象风格,自由拓展,驾驭感。
fire5
2015-11-04 17:45:04 +08:00
@lianghui 是的,真看过。 目前我们项目 2 台机器,每个 4 个 tornado 进程,前端 nginx upstream 分发,毫无问题,未来碰到性能问题,第一解决方案还是优化业务逻辑和 sql 。第二方案水平扩展机器。 第三才是异步化操作。第四也是比较终极方案了 elasticsearch 搜索, es 本身提供 http api ,用 tornado 的异步 httpclient 非常容易包装。

结论:思考可以复杂点,实现简单点搞。性能没那么可怕,也没来的那么快。(普通 web 应用)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX