当前位置:   article > 正文

学习狗书flask web,发现有时候db.session.add(current_user),有时db.session.add(current_user._get_current_object())

current_user._get_current_object()

当修改数据库的数据的时候,需要运行db.session.add()和db.session.commit()
但是我发现,db.session.add()的东西不一样,比如在main\views.py的edit_profile()中

	current_user.name = form.name.data
    current_user.location = form.location.data
    current_user.about_me = form.about_me.data
    db.session.add(current_user._get_current_object())   # here
    db.session.commit()
  • 1
  • 2
  • 3
  • 4
  • 5

而在auth\views.py的change_password()中用的是

	current_user.password = form.password.data
    db.session.add(current_user)             #here
    db.session.commit()
  • 1
  • 2
  • 3

我没看出来这两者的使用场景的区别,为什么第一个得用.get_current_object()函数呢?
在send_email()中也用到了current
_app._get_current_object(),但是我知道那和异步通信有关,是为了解除current_app()的线程隔离,详情参考:python- flask current_app详解,与 current_app._get_current_object()的区别以及异步发送邮件实例
官方文档的最后也有提及:The Request Context

但是这里是为什么?

第一步,惯例先看源码:

"""Return the current object this proxy is bound to. If the proxy is
    unbound, this raises a ``RuntimeError``.

    This should be used if you need to pass the object to something that
    doesn't understand the proxy. It can also be useful for performance
    if you are accessing the object multiple times in a function, rather
    than going through the proxy multiple times.
    """
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

大概意思是用不了current_user 的时候就用current_user._get_current_object().还有如果需要多次访问的话使用_get_current_object() 比使用current_user代理的性能高,而edit_profile()确实涉及到多次访问。


下面贴上几个我在解决困惑时给到我启发的帖子:提到了上下文
[AF] current_user vs. current_user._get_current_object()

本书作者也来回答了,current_app.get_current_object().是为了解决多线程,current_user.get_current_object() 是在db.relationship中
current_app vs current_app._get_current_object
虽然我这里只谈到了current
_user

以及GitHub上的给我proxy的启发
https://github.com/miguelgrinberg/flasky/issues/348

更新:学到后面的博客文章,发现也适用于解释:
post = Post(body=form.body.data, author=current_user._get_current_object())
用current_user._get_current_object()而不是current_user
另外这里用author而不是author_id 是因为在model.py的User表的relationship的backref中为Post表定义了属性“author”
posts = db.relationship('Post', backref='author', lazy='dynamic')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/510847
推荐阅读
相关标签
  

闽ICP备14008679号