如何使用Django具有持久性会话变量?

时间:2019-02-04 15:29:36

标签: python django

我的数据库中有一个触发器,它将根据会话变量的值自动更新row_modified_by_user列。

要在Django中执行此操作,我相信我必须将其放入我的settings.py文件中:

'my_db': {
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'my_db_name',
    'USER': 'my_db_user',
    'PASSWORD': '******',
    'HOST': 'my_host',
    'PORT': '12345',
    'OPTIONS': {
        'init_command': "SET @SessionForUser = '" + CURRENT_USER + "'",
    }
}

现在,CURRENT_USER是正在登录的用户。如何将该值从views.py传递到settings.py?

请注意,我无法在views.py中使用连接游标,因为该连接不是持久性的,此后它会关闭,因此在执行命令后会清除会话变量:

with connections['my_db'].cursor() as cursor:
    cursor = connection.cursor()
    cursor.execute("SET @SessionForUser = '" + CURRENT_USER + "'")                

我也不能使用全局变量,因为它仅用于读取(而不是写入)值:

settings.CURRENT_USER = username

对此有什么好的选择?也许我没有正确解决此问题?

1 个答案:

答案 0 :(得分:0)

好的,因此考虑丹尼尔(Daniel)的评论,我决定使用其他方法:

现在这是我在保存方法中使用的:

def save(request, form):
[...]
   item = form.save(commit=False)

   if item._state.adding:
       item.created_by_username = request.user.username
   else:
       item.modified_by_username = request.user.username

   item.save()
[...]

此外,当用户名字段更新时,我的数据库具有触发器来更新时间戳。另外,我可以通过使用django方式代替那些时间戳:

https://timonweb.com/tutorials/automatic-created-and-updated-datetime-fields-for-django-models/