Django是否首先在我自己的应用程序之前评估site-packages中的__init__.py文件?

时间:2015-07-27 23:05:40

标签: python django

我想在我的Django项目的site-packages中修补一个库,看起来这样做的逻辑位置在我的一个Django应用程序的__init__.py文件中。但是,如果Django不保证在我自己的软件包之前运行__init__.py中的site-packages文件,这不会导致启动时出现竞争条件吗?

或许猴子修补的行为会自动导致python首先加载我想修补的引用模块,这个问题没什么问题呢?

1 个答案:

答案 0 :(得分:0)

如果你需要在加载Django之前对库进行猴子修补,你需要在加载Django之前对库进行修补:)

如果您正在使用Gunicorn,那么执行此猴子修补的位置可能是在自定义pre_fork()post_fork()服务器挂钩中。必须在带有config选项的gunicorn的python文件中定义钩子函数。例如,如果你正在使用<div class="wrap"> <h5>Renter 1 Package</h5> <div class="choose-wrap"> <label>Skier/Snowboard</label> <select name="feet" required="required" class="choose-options"> <option value="a">...</option> <option value="ski">Skis</option> <option value="snowboard">Snowboard</option> </select> </div> <div class="ski-options"> <label>Ski Options</label> <input type="checkbox" name="vehicle1" value="Skis"> Skis <br> <input type="checkbox" name="vehicle2" value="Boots"> Boots <br> <input type="checkbox" name="vehicle2" value="Poles"> Poles <br> <input type="checkbox" name="vehicle2" value="Helmet"> Helmet <br> </div> <div class="snb-options"> <label>Snowboard Options</label> <input type="checkbox" name="vehicle1" value="Snowboard"> Snowboard <br> <input type="checkbox" name="vehicle2" value="Boots"> Boots <br> <input type="checkbox" name="vehicle2" value="Helmet"> Helmet <br> </div> </div> <div class="wrap"> <h5>Renter 2 Package</h5> <div class="choose-wrap"> <label>Skier/Snowboard</label> <select name="feet" required="required" class="choose-options"> <option value="a">...</option> <option value="ski2">Skis 2</option> <option value="snowboard2">Snowboard 2</option> </select> </div> <div class="ski2-options"> <label>Ski Options</label> <input type="checkbox" name="vehicle1" value="Skis"> Skis 2<br> <input type="checkbox" name="vehicle2" value="Boots"> Boots 2<br> <input type="checkbox" name="vehicle2" value="Poles"> Poles 2<br> <input type="checkbox" name="vehicle2" value="Helmet"> Helmet 2<br> </div> <div class="snb2-options"> <label>Snowboard Options</label> <input type="checkbox" name="vehicle1" value="Snowboard"> Snowboard 2<br> <input type="checkbox" name="vehicle2" value="Boots"> Boots 2<br> <input type="checkbox" name="vehicle2" value="Helmet"> Helmet 2<br> </div> </div>,那么在psycopg2钩子中对post_fork()(Postgres python库)进行修补是很常见的。除非您使用preload选项,否则这两个钩子都会在加载Django应用程序之前运行。

如果您使用gevent选项,那么您必须使用on_starting()when_ready()挂钩,因为在预加载流程中Django会先加载 preloadpre_fork()挂钩被调用。请记住,你也可以在非预装的情况下使用这些钩子,但是当gunicorn仍在初始化时会调用这些钩子,而限制猴子修补的范围以防止意外的副作用是一种很好的做法。