# torngas
**Repository Path**: fkgte/torngas
## Basic Information
- **Project Name**: torngas
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: BSD-3-Clause
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-04-21
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#Torngas Web Framework
A simple app web framework based on tornado.
[](https://travis-ci.org/mqingyn/torngas)
###version:1.8.2
Torngas 是基于[Tornado](https://github.com/tornadoweb/tornado)的web mvc框架。Torngas 大量参考和借鉴了Django的设计模式,形成一套基于tornado的Django like应用层开发框架。tornado 建议使用4.0以上版本,注意:torngas不支持基于WSGI的应用。
##**框架依赖**
* future
* tornado>=3.2
##**安装**
* **pip**: `pip install torngas`
##**快速入门**
* 导引:
* [目录结构](#user-content-目录结构示例)
* [settings 配置](#user-content-settings配置)
* [webserver](#user-content-webserver)
* [app](#user-content-app)
* [urls](#user-content-urls)
* [log](#user-content-log)
* [模板引擎](#user-content-模板引擎)
* [handler](#user-content-handler)
* [中间件](#user-content-中间件)
* [HTTP处理器](#user-content-http处理器)
* [缓存](#user-content-缓存)
* [db&orm](#user-content-dborm)
* [线程池异步](#user-content-异步线程池)
* [session](#user-content-session)
* [signal](#user-content-signal)
* ####目录结构示例:
|- app
+- myapp1
| |- urls.py
| |- handlers
| |- hello_china.py
| |- hello_usa.py
| |- ...
|
+- myapp2
| |- ...
|
+- logs
|
+- middlewares
| |- ...
|
+- settings
| |- settings.py
| |- settings_online.py
|
+- httpmodules
| |- ...
|
+- templates
| |- ...
|
+- statics
| |- ...
+- runserver.py
* helloworld :
你可以参考demo目录下的 `helloworld` 项目示例,并运行:
python demo/runserver.py --address=0.0.0.0 --port=8000 --settings=settings.setting
启动服务后,在浏览器中查看 `127.0.0.1:8000` ,你应该可以看到一个欢迎页面!
* ####settings配置:
在项目runserver.py中,你可以指定使用的预设值的默认配置文件,如配置文件在应用根目录app.settings下的setting.py:
os.environ.setdefault('TORNGAS_APP_SETTINGS', 'settings.setting')
在程序启动时,首先会检查 `--settings=` 是否给定如`--settings=settings.setting`,框架将自动加载应用目录下settings模块中的setting.py配置文件,如果未规定,则使用以上预设值默认配置。在项目中使用配置:
from torngas import settiings
project_path = settings.PROJECT_PATH
*version 1.6.7 add* :
`DEBUG`: 控制应用是否处于debug状态,等同于 tornado的debug参数。
`XHEADERS`: 控制是否开启httpserver的 xheaders。你不用再额外传递一个xheader参数。
* ####webserver:
最简单的server启动方式:
from torngas.webserver import run
run()
这将启动一个默认的tornado进程,如果想控制更多细节,你可以:
from torngas.webserver import Server
from tornado.options import define
define("your_arg", default='default', help='your command args', type=str)
serv = Server()
serv.parse_command() #你必须调用parse_command()来处理tornado options,否则无法加载配置
serv.load_urls()
serv.load_application(application=None) # 或根据你的需求自定义Application
serv.server_start(sockets=None, **kwargs)
很多情况下,我们希望对Application对象进行个性化的处理,通常,我们习惯于实现一个Application子类:
*version 1.6.7 add*:
from torngas.application import Application
class MyApp(Application):
"""your custom code"""
Server().load_application(MyApp)
...
`load_application` 接收一个 `torngas.applicatoin.Application` 类实例或其子类
>如果要使用torngas的全部功能,你的自定义 `application` 不能直接继承于 `tornado.web.Application` 。
>Server对象的 `server_start`,`load_all` 以及 `torngas.run` 支持自定义的 `httpserver` 参数
>
> Server().server_start(no_keep_alive=True,backlog=512)
*version 1.6.7 add* :
`server.load_all` :如果你希望控制一些细节,但是又希望更简单的启动服务 , `load_all()` 会是更好的选择。
serv = Server()
serv.load_all(application=MyApp,no_keep_alive=True,backlog=512)
serv.start()
>与 `server_start` 不同的是,load_all,以及 `torngas.run` 会帮你自动 `parse_command`,处理tornado.options ,所以不需要手动调用它。其他方式你需要手动调用 `parse_command` 。
`parse_command`: Server对象的 `parse_command` 方法的作用等同于 tornado 中的 `parse_command_line` 同时为你初始化 log日志配置,你必须放在 `define` 语句之后调用,否则定义的参数将不起作用。
>你可能注意到 `start` 方法,这个方法类似于ioloop.start ,同时在debug模式下打印一些基础启动信息。 `server_start` 还会帮你处理httpserver的加载。所以,当你使用server_start时,不需要在调用 `start`方法或 `ioloop.start()`。
>当你使用 `load_all` 来载入 `application` 和 `httpserver` 时,使用 `start` 是更好的选择 。
* ####app:
如顶述目录结构,您可以在应用根目录下创建多个app模块,假如你建立了应用myapp1,应用目录中**必须**包含 `urls.py`。
同时,要加载你的应用,你需要在配置文件中 `INSTALLED_APPS` 元组中增加你的app配置,如你的应用根目录app下存在myapp1,myapp2,则需:
INSTALLED_APPS = (
'myapp1',
'myapp2',
)
系统启动后,将自动加载myapp1,myapp2中的urls.py下的路由配置。
* ####urls:
每一个app都必须包含一个urls.py的路由表文件。你可以像这样配置路由:
from torngas import Url, route
u = Url('myapp1.handlers',abc='abc')
urls = route(
u(name='Index', pattern=r'/?', handler='main_handler.Main'),
u(name='Login', pattern=r'/login/?', handler='main_handler.Login'),
u(name='User', pattern=r'/user/?', handler='main_handler.User'),
)
Url()接受参数 `prefix` 模块前缀,上述例子中最终的加载handler模块为: `myapp1.handlers.main_handler.Main`.
Url()还可以接受若干全局预加载参数。其作用等同于tornado 路由的kwargs参数,此参数将会被解析到每个handler的\_url_kwargs变量中,如上述abc='abc'。
main_handler.Main:
from torngas.handler import WebHandler
class Main(WebHandler):
def get(self):
self.finish(self._url_kwargs['abc']) # print abc
每一个url还可以接受一个kwargs参数,这个参数仅对当前路由有效,其作用等同于上述的_url_kwargs,同样会被解析到\_url_kwargs字典中。如果遇到同名参数,路由的kwargs会覆盖Url()中定义的同名参数,但仅影响当前路由。
u(name='User', pattern=r'/user/?', handler='main_handler.User',kwargs={'abc':'other'}),
你也可以直接import对应的handler:
from myapp1.handlers.main_handler import Main
u = Url()
urls = route(
u(name='Index', pattern=r'/?', handler=Main),
)
*路由分组*:
当你有许多路由时,为了便于管理,你可以将路由分散到多个文件中:
url_photo.py:
url=Url('myapp1.handlers')
URLS = route(
url(r'photo/upload/?','photo.UploadHandler'),
...
)
url_blog.py:
url=Url('myapp1.handlers')
URLS = route(
url(r'blog/list/\d*/?','blog.ListHandler'),
...,
)
urls.py:
from torngas import route
from myapp1.url_blog import URLS as blog_urls
url = Url('myapp1.handlers')
URLS = route(
include('/','myapp1.url_photo.URLS'),
include('/',blog_urls),
url(r'/user/me/?','user.MeHandler'),
)
* ####log:
###### version add:1.8.0
torngas支持使用原生tornado日志模块,或torngas基于logging扩展日志,torngas默认启用扩展日志代替tornado默认的log,除非`--disable_log=False` ,则启用tornado.log模块 。
from torngas.logger import syslogger
syslogger.error("this is a error.")
日志配置中的默认日志HANDLER默认为 `torngas.logger.ProcessLogTimedFileHandler` ,此handler支持在多进程状态下安全的写入日志文件,如需日志文件名按照端口号区分,通过设置 `--log_port_prefix=true` , `--logging_dir` 如果设定, 配置文件中的 `LOGGING_DIR` 将被忽略。
你可以自定义你的日志配置,或新增日志,你只需要在LOGGING配置中加入类似段落:
{
'name': 'tornado',
'level': 'INFO',
'log_to_stderr': False,
'when': 'midnight',
'interval': 1,
'filename': 'tornado.log'
},
> 注:请保留默认的几个日志配置。
* ####模板引擎:
在配置文件 `TEMPLATE_CONFIG` 中配置模板。 其中,`template_engine` 决定使用什么模板加载器(Loader) ,默认为 None,使用自带的模板引擎。 可选择使用 mako 或 jinja2 ,*需要安装依赖库 mako或jinja2* 。
TEMPLATE_CONFIG = {
'template_engine': 'torngas.template.mako_loader.MakoTemplateLoader' #使用mako模板
'filesystem_checks': True, # 通用选项
'cache_directory': '../_tmpl_cache', #通用选项,模版编译临时文件目录
'collection_size': 50, #mako选项,暂存入内存的模版项,可以提高性能,详情见mako文档
'cache_size': 0, #jinja选项,类似于mako的collection_size,设定为-1为不清理缓存,0则每次都会重编译模板
'format_exceptions': False, #mako选项,格式化异常输出
'autoescape': False #jinja2选项,默认转义设定
# 支持mako或jinja其他配置参数,详见相关文档。
}
* ####handler:
如果需要使用torngas提供的功能,业务handler需要继承自 `torngas.handler.WebHandler`或 `torngas.handler.ApiHandler` .
WebHandler提供了兼容mako,jinja2模板引擎加载,中间件hook的功能。并额外提供两个方法 `on_prepare` 和 `complete_finish` ,
这两个方法分别在 `prepare` 和 `on_finish` 方法执行结束后调用。
同时,torngas提供了一个 `FlashMessageMixIn` ,可以配合handler实现消息闪现的功能,其作用类似flask中的flash。你的handler需要继承 `FlashMessageMixIn` :
class MyHandler(FlashMessageMixIn,WebHandler):
def get(self):
self.flash("Welcome back, %s" % username, 'success')
base.html
------------
{% set messages = handler.get_flashed_messages() %}
{% if messages %}