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

由于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级讲师

répondre à tous(4)
巴扎黑

Le moyen le plus simple est d'écrire une classe proxy

def User(object):
    def function1(self):
        #some code

    def function2(self):
        #some code

class UserProxy(User):
    def function1(self):
        return get_current_user().function1()

    def function1(self):
        return get_current_user().function1()

current_user = UserProxy()
Peter_Zhu

Si oui, l'aimeriez-vous ? (Utilisez random juste pour tester, vous pouvez l'ignorer...)

import random

class Current:

    @property
    def user(self):
        return random.randint(1, 10)

current = Current()
print(current.user)
print(current.user)
print(current.user)
print(current.user)

current.user a le même nombre de mots que current_user

Résultat :

7
2
9
1

Je pense

Il n'y a rien de mal à appeler une fonction...
Mais s'il y a un expert qui sait comment résoudre ce problème (sans utiliser l'astuce de l'objet), faites-le moi savoir !!


Questions auxquelles j'ai répondu : Python-QA

阿神

La connexion à flask_login n'est-elle pas déjà effectuée ?

@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)

Après avoir défini ceci, chaque fois que current_user est appelé, l'objet utilisateur de l'utilisateur actuel sera renvoyé. Bien entendu, l'utilisateur doit implémenter la méthode get_id().
Référence : flask_login

阿神

à partir de la session d'importation de flacon, redirection, url_for
à partir de ..models import User
à partir de 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)

L'utilisateur_actuel ici est l'utilisateur_actuel, l'agent LocalProxy l'a fait plusieurs fois.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal