创建入口
入口
每一个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()
那么,在重新定义main为ngx_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(...)