python - 为一个变量设置代理
PHP中文网
PHP中文网 2017-04-18 09:07:06
0
4
693

由于sae上不能使用flask-login,所以我只能自己写一个flask-login里的current_user

现在有一个函数get_current_user
调用后会返回一个User对象
如:

user = get_current_user()

怎么样给变量current_user设置一个代理使每一次调用这个对象都会是get_current_user的返回值

仿照flask-login源码,找到一个方法:

    from flask import (session,
                       redirect,
                       url_for)
    from ..models import User
    from werkzeug.local import LocalProxy
    def get_current_user():
        current_user = User.query.get(session.get('current_user_id'))
        return current_user
    current_user = LocalProxy(get_current_user)
    
在别的地方导入current_user即可

如果问题引申为为一个变量设置代理呢,有没有简单的写法呢,不用到库

@cppprimer 的答案给我了思路

class Proxy(object):
    def __init__(self, local):
        self._local= local

    def __getattribute__(self,args):
        return object.__getattribute__(self,'_local')().__dict__[args]

class User(object):
    def __init__(self):
        self.num = 1

user= User()

def get_current_user():
    return user

current_user = Proxy(get_current_user)
print(current_user.num)
user.num = 2
print(current_user.num)

输出
1
2

但是这样直接调用current_user的返回值不是一个User对象,而是一个Proxy对象

PHP中文网
PHP中文网

认证0级讲师

全員に返信(4)
巴扎黑

最も簡単な方法は、プロキシ クラスを記述することです

リーリー
いいねを押す +0
Peter_Zhu

そうであれば、よろしいですか? (random はテストのためだけに使用してください。無視しても構いません...)

リーリー

current.usercurrent_user

と同じ単語数です

結果:

リーリー

私はそう思います

関数を呼び出すことに問題はありません...
しかし、この問題を (オブジェクトトリックを使用せずに) 解決する方法を知っている専門家がいたら、私に知らせてください!!


私が回答した質問: Python-QA

いいねを押す +0
阿神

flask_login は既に完了していますよね?

リーリー

これを設定すると、current_user が呼び出されるたびに、現在のユーザーのユーザー オブジェクトが返されます。もちろん、ユーザーは get_id() メソッドを実装する必要があります。
参照: flask_login

いいねを押す +0
阿神

from flask import session、redirect、url_for
from ..models import User
from werkzeug.local import LocalProxy
def get_current_user():

リーリー

current_user = LocalProxy(get_current_user)

ここでの current_user は current_user であり、LocalProxy エージェントはこれを何度も行っています。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート