我想在我的Django项目的site-packages
中修补一个库,看起来这样做的逻辑位置在我的一个Django应用程序的__init__.py
文件中。但是,如果Django不保证在我自己的软件包之前运行__init__.py
中的site-packages
文件,这不会导致启动时出现竞争条件吗?
或许猴子修补的行为会自动导致python首先加载我想修补的引用模块,这个问题没什么问题呢?
答案 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会先加载 preload
和pre_fork()
挂钩被调用。请记住,你也可以在非预装的情况下使用这些钩子,但是当gunicorn仍在初始化时会调用这些钩子,而限制猴子修补的范围以防止意外的副作用是一种很好的做法。