创建入口

入口

每一个ngx应用都必须有一个入口。入口其实就是一个函数,函数中是这个程序的主代码。

在运行阶段,ngx会从这个入口进入,同时给您一些重要的参数。

入口其实就是我们通常所说的main函数。

在C/C++中,main函数这么写:

int main(){
	return 0;
}

在Python中,大家约定这么写:

def main():
	pass


if __name__ == "__main__":
	main()

没错,ngx的入口就相当于一个main函数。当然,在创建了这个入口之后,原来的main函数就不需要了。

函数原型

ngx_entry(args: Optional[dict, str, 'EntryArgs'] = None) -> None

入口的名字必须是ngx_entry,否则ngx将无法识别它。

入口必须有至少一个可选参数,因为ngx在运行的时候会将EntryArgs传给入口。

如此,您只需要定义一个名为ngx_entry的函数——更多情况下只是把main重命名为ngx_entry——就可以创建入口了

和main的区别

如果您之前是这么写的:

def main(): ...


main()

那么,在重新定义mainngx_entry之后,您必须在ngx_entry()之前加上:

if __name__ == "__main__":

否则,您的程序将会运行两次。ngx在运行阶段会先导入您的主文件(此时已经运行了一次ngx_entry),然后再为您调用ngx_entry,所以您不需要自己调用一次ngx_entry

当然,您也可以直接删掉最后一行,不过这可能对其他阅读此代码的人不友好——他们将不会知道这个程序从哪里开始。

ngx已经考虑到了这一点:如果您给ngx.init传入Ellipsis(省略号,python中的…),那么就会报错。

此功能主要用于标记有ngx_entry入口的python文件将不再能通过普通python解释器运行,而必须通过ngx.control.run_app接口来运行

为了实现这一点,您需要额外在ngx_entry中增加一行:

ngx.init(args)

当然,在最前面您就需要加入:

import ngx

最后一行变成:

ngx_entry(...)

尽管这些操作都不是必要的,但是,提高您代码的可读性也是非常有用的。只要大家都采用这个约定,假如其他会ngx的人得到了您的代码,他就可以根据错误提示而知道,需要打包这个ngx应用。另外。如果他是一个高级开发者,还可以通过手动调用ngx_entry("/path/to/an/nginex/env")这种形式来手动初始化,以满足他的调试需求。

所以,您最好在ngx_entry中增加初始化这一行。对您来说,这是没有必要的;对他人来说,这却是至关重要的:

ngx.init(args)

相对应的,在运行完成时,您也最好加上这一行:

ngx.quit()

如果您还想进一步了解NGINEX的初始化系统是如何运作的,包括EntryArgs的具体信息,可以看这里。

模板

综上所述,一个ngx应用应该是像这样的:

import ngx


def ngx_entry(args=None):
	ngx.init(args)
	# Your code goes here
	# maybe:main()
	ngx.quit()


if __name__ == "__main__":
	ngx_entry(...)