tornado 的 define 和options方法解读
一、源码解读
tornado是facebook开源的非阻塞web容器,类似java的netty,tornado.options是负责解析tornado容器的全局参数的,同时也能够解析命令行传递的参数和从配置文件中解析参数。使用步骤如下:
1. 源码中的示例代码,定义全局变量:
from tornado.options import define, options
define("mysql_host", default="127.0.0.1:3306", help="Main user DB")
define("memcache_hosts", default="127.0.0.1:11011", multiple=True,
help="Main user memcache servers")
def connect():
db = database.Connection(options.mysql_host)
...
2. 在模块的main函数中解析命令行参数或者配置文件
Your ``main()`` method can parse the command line or parse a config file with
either::
tornado.options.parse_command_line()
# or
tornado.options.parse_config_file("/etc/server.conf")
命令行参数格式:--myoption=myvalue
配置文件可以是python文件,参数格式为:
myoption = "myvalue"
myotheroption = "myothervalue"
3. Tornado.options默认是定义为单例模式的,通过tornado.options.options对象来维护全局参数,如果在线程中需要维护自己的变量,也可以使用tornado.options. OptionParser对象来维护参数。tornado.options.options就是通过实例OptionParser的对象来实现的,而且把define、parse_command_line、parse_config_file放到tornado.options 包中,可以直接使用,与调用tornado.options.options的方法是一致的。代码如下:
options = OptionParser()
"""Global options object.
All defined options are available as attributes on this object.
"""
def define(name, default=None, type=None, help=None, metavar=None,
multiple=False, group=None, callback=None):
"""Defines an option in the global namespace.
See `OptionParser.define`.
"""
return options.define(name, default=default, type=type, help=help,
metavar=metavar, multiple=multiple, group=group,
callback=callback)
def parse_command_line(args=None, final=True):
"""Parses global options from the command line.
See `OptionParser.parse_command_line`.
"""
return options.parse_command_line(args, final=final)
def parse_config_file(path, final=True):
"""Parses global options from a config file.
See `OptionParser.parse_config_file`.
"""
return options.parse_config_file(path, final=final)
二、应用
# 在tornado.options.options配置变量名
from tornado.options import define, options
define('debug', default=True, help='enable debug mode')
define('project_path', default=sys.path[], help='deploy_path')
define('port', default=, help='run on this port', type=int)
# 从命令行中解析参数信息, 如 python web.py --port=, 这里的port解析
tornado.options.parse_command_line()
使用参数
使用options获取刚设置的参数 from tornado.options import options
....
application.listen(options.port)
.....
settings = {
'debug': options.debug,
}
完整代码
#!/usr/bin/env python
# -*- coding: utf- -*-
# vim: set et sw= ts= sts= ff=unix fenc=utf8:
__author__ = 'okker.ma@gmail.com' import tornado.ioloop
import tornado.web import os
from tornado.options import options, define #在options中设置几个变量
define('debug', default=True, help='enable debug mode')
define('port', default=, help='run on this port', type=int) # 解析命令行, 有了这行,还可以看到日志...
tornado.options.parse_command_line() class MainHandler(tornado.web.RequestHandler): def get(self):
self.write("hello,a world") settings = {
'debug': options.debug,
'gzip': True,
'autoescape': None,
'xsrf_cookies': False,
'cookie_secret': 'xxxxxxx'
} application = tornado.web.Application([
(r'/', MainHandler)
], **settings) if __name__ == '__main__':
application.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
运行:
python web.py --port= --debug=True
示例二
#!/usr/bin/env python
# -*- coding:utf-8 -*- import tornado.httpserver
import tornado.ioloop
import tornado.web
from tornado.options import define, options
from test import aa define('config', default=None, help='tornado settings file', type=str) options.parse_command_line()
if options.config:
# print(options.settings)
aa()
else:
raise Exception("You must add a xxx.py at settings/ folder, then run: 'python app.py --settings=user'") class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting', 'Hello')
self.write(greeting + ', friendly user!') if __name__ == "__main__":
app = tornado.web.Application(
handlers=[(r"/", IndexHandler)]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
tornado.ioloop.IOLoop.current().start()
main.py
from tornado.options import options
import importlib # db_config = importlib.import_module('settings.%s.db_config'%options.settings)
#
# options.config = {
# 'MONGO': db_config.MONGO,
# 'SETTINGS': {},
# } def aa():
data = dict(options.items())
print("asdfasdf", data["config"])
other.py
注意 tornado如果启动多进程, option方法是不可实现的, 报错
tornado.options.Error: Option 'lalala' already defined in app.py
没找到解决办法
本文参考链接:(其实这篇是抄的, 哈哈哈)
1. https://blog.csdn.net/wgw335363240/article/details/50755782
2. https://my.oschina.net/jiemachina/blog/204875
三、多进程解决办法 ---》哈哈哈,找到解决办法啦~
怎么解决呢?,单利模式嘛,哈哈哈
一定要把options的东西放启动脚本的最上面, 要不下面调用的时候报错
问题出在哪呢?
多进程是启动多个,当已经define定义key的时候, OK, 可是同时启动多个啊, memory中已经有定义好的define的你定义的key了呀
判断一下嘛, 就好啦
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.options import define, options try:
if options.lalala:
pass
except:
define('conf', default='zk_css.cnf', help='tornado settings file', type=str) import tornado
import tornado.ioloop
import tornado.web
import os, sys
from tornado.httpserver import HTTPServer
from tornado.options import define, options
from controllers.home_handlers import My404, write_error
from common.util.include_url_model import url_wrapper, include
from common.base import Config ServerPort = Config().get_content("server")
define("port", default=ServerPort["serverport"], type=int) options.parse_command_line() _ROOT_PATH = os.path.dirname(__file__)
ROOT_JOIN = lambda sub_dir: os.path.join(_ROOT_PATH, sub_dir) router = url_wrapper([
(r'', include('urls')),
]) settings = dict(
template_path=ROOT_JOIN('views'),
static_path=ROOT_JOIN('static'),
# cookie_secret=Env.COOKIE_SEC,
default_handler_class=None,
debug=False
) tornado.web.RequestHandler.write_error = write_error
application = tornado.web.Application(router, **settings) if __name__ == "__main__":
server = HTTPServer(application, max_buffer_size=504857600)
server.bind(options.port, address="0.0.0.0")
server.start(10) # Forks multiple sub-process
tornado.ioloop.IOLoop.current().start()
app.py
#!/usr/bin/env python
# -*- coding:utf-8 -*- import configparser
import os, json, base64
from decimal import Decimal
import datetime, time
import pymongo
# import MySQLdb
import pymysql
from common.log.loger import Logger
import datetime, time, uuid, re
import hashlib
from common.error import *
from other_url import BaseConf
from tornado.options import define, options def my_options(arg):
return dict(options.items())[arg] class Config(object):
"""
# Config().get_content("user_information")
""" def __init__(self): # file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "conf", BaseConf.BaseCnf)
file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "conf", my_options("conf"))
self.cf = configparser.ConfigParser()
self.cf.read(file_path) def get_sections(self):
return self.cf.sections() def get_options(self, section):
return self.cf.options(section) def get_content(self, section):
result = {}
for option in self.get_options(section):
value = self.cf.get(section, option)
result[option] = int(value) if value.isdigit() else value
return result
Base.py
分割线
==========================================
屁, 他娘的,根本没解决,大爷的, 问题出在哪儿了,百度FORK() 函数,跟他有关
解决办法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.options import define, options if "conf" in dict(options.items()):
pass
else:
define("conf", default='zk_css.cnf', help='tornado settings file', type=str) import tornado.web
import os
from tornado.httpserver import HTTPServer
from tornado.options import define, options
from controllers.home_handlers import My404, write_error
from common.util.include_url_model import url_wrapper, include
from common.base import Config ServerPort = Config().get_content("server")
define("port", default=ServerPort["serverport"], type=int) options.parse_command_line() _ROOT_PATH = os.path.dirname(__file__)
ROOT_JOIN = lambda sub_dir: os.path.join(_ROOT_PATH, sub_dir) router = url_wrapper([
(r'', include('urls')),
]) settings = dict(
template_path=ROOT_JOIN('views'),
static_path=ROOT_JOIN('static'),
# cookie_secret=Env.COOKIE_SEC,
default_handler_class=None,
debug=False
) tornado.web.RequestHandler.write_error = write_error
application = tornado.web.Application(router, **settings) if __name__ == "__main__": from tornado.netutil import bind_sockets
from tornado.process import fork_processes
from tornado.ioloop import IOLoop sockets = bind_sockets(port=options.port, address="0.0.0.0")
fork_processes(10)
server = HTTPServer(application, max_buffer_size=504857600)
server.add_sockets(sockets)
IOLoop.current().start()
分割线
===========================================
草,又特么不行了,为什么呢? 因为出现了两种不同结果, 麻痹的, 没找到解决办法
root@corleone:/opt/code/my_code/zk_css# python3 app.py --port=8010 --conf=zk_css_2.cnf
base: zk_css.cnf
base: zk_css.cnf
base: zk_css.cnf ----》 看这儿
base: zk_css.cnf
base: zk_css_2.cnf --》 看这儿
base: zk_css_2.cnf
base: zk_css_2.cnf
/usr/local/lib/python3.5/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.
from pandas.core import datetools
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
base: zk_css_2.cnf
zk_css_2.cnf
8010
[I 180906 16:56:49 process:133] Starting 10 processes
tornado 的 define 和options方法解读的更多相关文章
- tornado自定义实现django include方法
tornado自定义实现django include方法 自定义URLmethod模块 from Custom.errors import * def include(base_url, expan ...
- tornado架构分析2 options.py实现原理
总结体会: options这个文件是用来管理程序运行过程中配置的,它采用了单例模式,整个程序运行时只有一个实例存在. 参数可以从命令行读取,也可以从配置文件中读取,就看你怎么用了. 同时,option ...
- [轻微]WEB服务器启用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等协议访问应用程序/tomcat下禁用不安全的http方法
使用了360网站安全检测 查到有OPTIONS方法 百度了下 https://my.oschina.net/maliang0130/blog/338725 找到这个方法奈何http.conf 找不到无 ...
- SIP中OPTIONS方法的用法及示例
SIP中OPTIONS方法的用法及示例 用OPTIONS方法实现Keep Alive SIP keep-alive方法
- Connection 对象简介 方法解读 JDBC简介(四)
通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接 Connection conn = DriverManager.getConnection ...
- django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...
- Tornado 自定义Form,session实现方法
一. 自定义Tornado 验证模块 我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单 ...
- HTTP的options方法作用
1.HTTP的options方法作用 检测服务器所支持的请求方法.(比如:‘/user'路由支持哪些方法:get.post.delete...) CORS中的预检请求(检测某个接口是否支持跨域) 2. ...
- Java安全之原生readObject方法解读
Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...
随机推荐
- 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...
- 基于Django的独立运行的python脚本开发
Django框架很方便,比如其方便的ORM,如果写基于Django的独立运行脚本,主要在脚本前面加上以下代码: import sys,os,django sys.path.append(os.path ...
- lua -- handler
handler 将 Lua 对象及其方法包装为一个匿名函数. 格式: 函数 = handler(对象, 对象.方法) 在 quick-cocos2d-x 中,许多功能需要传入一个 Lua 函数做参数, ...
- angular五种服务详解
在这之前angular学习笔记(十五)-module里的'服务'这篇文章里,已经大致讲解了ng中的'服务',在之后的很多地方也用到了服务,但是,所有的服务都是使用app.factory来创建的.但其实 ...
- Anaconda的使用和包的更新;conda 创建虚拟环境
安装: 官网下好后,直接 sh * 会提示安装路径,选择No的话重新填入安装的路径就可以了: 添加到环境变量: echo 'export PATH="~/anaconda2/bin/$PAT ...
- PostgreSQL获取table名,字段名
PostgreSQL获取数据库中所有table名: SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablena ...
- WebService 获取当前URL
private string pageRoot = string.Empty; public virtual string PortalRoot { get { if (pageRoot == nul ...
- thinkphp验证码乱码的解决办法
很有可能是入口文件index.php和.htaccess文件要转换成 以UTF-8无BOM格式编码
- JVM——代空间的划分
首先看在JVM的堆中,按代的划分: Young:主要是用来存放新生的对象. Old:主要存放应用程序中生命周期长的内存对象. Permanent:是指内存的永久保存区域,主要存放Class和Meta的 ...
- WPF视频会议系统资料
Android和C#实现实时视频传输Demo 视频会议及流媒体十大开源项目 WinForm二三事(三)Control.Invoke&Control.BeginInvoke