Django 代码中的哪里放置代码断开信号并进行猴子修补?
Where in Django code put code disconnecting signal and doing monkey-patching?
我正在为 Django 2.2 开发自定义授权后端。我不希望 django 为用户更新 last_login
所以我想断开信号 user_logged_in
触发 update_last_login
.
我还必须在 SimpleJWT 库中做猴子补丁,将 User 更改为指向 OtherUserModel
放置此代码的最佳位置在哪里?现在,我已经添加了 CoreConfig.ready
方法并且它有效,但是它是这个逻辑的好地方吗?
from django.apps import AppConfig
class CoreConfig(AppConfig):
name = 'core'
def ready(self):
from django.contrib.auth import user_logged_in
from django.contrib.auth.models import update_last_login
user_logged_in.disconnect(update_last_login, dispatch_uid='update_last_login')
import rest_framework_simplejwt.state
rest_framework_simplejwt.state.User = OtherUserModel
我会说是的,但我认为这里没有明确的对错,关于连接信号,Django 文档说明如下:
Strictly speaking, signal handling and registration code can live
anywhere you like, although it’s recommended to avoid the
application’s root module and its models module to minimize
side-effects of importing code.
In practice, signal handlers are usually defined in a signals
submodule of the application they relate to. Signal receivers are
connected in the ready() method of your application configuration
class. If you’re using the receiver() decorator, simply import the
signals submodule inside ready().
我的意见是,如果推荐的连接信号的方式是在你的 AppConfig
的 ready()
方法中进行,那么断开信号和相关的 monkeypatching 也应该在这个方法中进行。
我经常做的是:
- 除了乱用默认的 signals/classes 之外,还有其他方法可以解决这个问题吗?
- 如果没有,请在 AppConfig ready() 方法中执行此代码
- 编写某种单元测试或集成测试以确保我的代码执行我希望它执行的操作,即使在更新依赖项等时也是如此。
我正在为 Django 2.2 开发自定义授权后端。我不希望 django 为用户更新 last_login
所以我想断开信号 user_logged_in
触发 update_last_login
.
我还必须在 SimpleJWT 库中做猴子补丁,将 User 更改为指向 OtherUserModel
放置此代码的最佳位置在哪里?现在,我已经添加了 CoreConfig.ready
方法并且它有效,但是它是这个逻辑的好地方吗?
from django.apps import AppConfig
class CoreConfig(AppConfig):
name = 'core'
def ready(self):
from django.contrib.auth import user_logged_in
from django.contrib.auth.models import update_last_login
user_logged_in.disconnect(update_last_login, dispatch_uid='update_last_login')
import rest_framework_simplejwt.state
rest_framework_simplejwt.state.User = OtherUserModel
我会说是的,但我认为这里没有明确的对错,关于连接信号,Django 文档说明如下:
Strictly speaking, signal handling and registration code can live anywhere you like, although it’s recommended to avoid the application’s root module and its models module to minimize side-effects of importing code.
In practice, signal handlers are usually defined in a signals submodule of the application they relate to. Signal receivers are connected in the ready() method of your application configuration class. If you’re using the receiver() decorator, simply import the signals submodule inside ready().
我的意见是,如果推荐的连接信号的方式是在你的 AppConfig
的 ready()
方法中进行,那么断开信号和相关的 monkeypatching 也应该在这个方法中进行。
我经常做的是:
- 除了乱用默认的 signals/classes 之外,还有其他方法可以解决这个问题吗?
- 如果没有,请在 AppConfig ready() 方法中执行此代码
- 编写某种单元测试或集成测试以确保我的代码执行我希望它执行的操作,即使在更新依赖项等时也是如此。