赞
踩
当修改数据库的数据的时候,需要运行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()
而在auth\views.py的change_password()中用的是
current_user.password = form.password.data
db.session.add(current_user) #here
db.session.commit()
我没看出来这两者的使用场景的区别,为什么第一个得用.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.
"""
大概意思是用不了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')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。