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 ...
随机推荐
- node webkit(nw.js) 设置自动更新
原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新 <script> var ...
- FLINK SQL Calcite原理
http://wuchong.me/blog/2017/03/30/flink-internals-table-and-sql-api/ https://cloud.tencent.com/devel ...
- 沐雪多用户微信公众平台开发源码,商城小程序源码(2018年最新的asp.net C# 微信源码,小程序源码)
现售价5400元,就可以搭建自己的微信平台啦 购买地址:https://item.taobao.com/item.htm?id=539102325336 该系统是由[上海沐雪网络]独家授权销售,其他地 ...
- VS调试dll
(ps:编译dll的工程最好配置一下预编译宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,选择编辑,在最下面加一行“_CRT_SECURE_NO_WARNINGS”) 1. 右键dl ...
- 【SimpleMsgPack.NET】发布一个msgpack协议C#版本的解析开源库
这两年一直都关注这IOCP在网络通信这方面的应用,当然数据的传递是经常需要的.今年接触了MsgPack格式,发现他用来做传输时数据打包真是太爽了.因为他可以直接打包二进制数据,不需要任何的转换.有人会 ...
- DIOCP开源项目-定义自己要发送的数据结构(MyObject)
印象中网络程序都是sendBuffer和recvBuffer来发送数据和接收数据,本次Demo演示如何定义定义一个自己的对象,然后我们按照OO的思想直接进行对象的发送和接收,先上个流程图. 下面是客户 ...
- Eclipse 使用 SVN 插件后修改用户方法汇总
http://blog.csdn.net/ShaneLooLi/article/details/50994005 ******************************************* ...
- 新的开始——LED灯汇编机器码的点亮方式
在几个月前看2440视频的时候,发现太多知识欠缺,购买开发板期间补习makefile,linux,arm汇编和arm构架之后,现在重新开始学习. 先看板子LED硬件连接图: 可以看到LED 1,2,4 ...
- win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 异常 解决办法
win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 错误 解决方法改注册表.这个就是DB03.EXE引起的. cmd打开注册表:regedit找到注册表"HKE ...
- FileNet P8 工作流生命周期管理和 Process Engine API 应用介绍
摘录:https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902wangzheng/ FileNet P8 工作流生 ...