由于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对象
Le moyen le plus simple est d'écrire une classe proxy
Si oui, l'aimeriez-vous ? (Utilisez
random
juste pour tester, vous pouvez l'ignorer...)current.user
a le même nombre de mots quecurrent_user
Résultat :
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 ?
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
L'utilisateur_actuel ici est l'utilisateur_actuel, l'agent LocalProxy l'a fait plusieurs fois.