찾다

 >  Q&A  >  본문

python - 为一个变量设置代理

由于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中文网2783일 전696

모든 응답(4)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-18 09:09:06

    가장 간단한 방법은 프록시 클래스를 작성하는 것입니다

    으아악

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 09:09:06

    그렇다면 괜찮을까요? (random는 테스트용으로만 사용하셔도 무방합니다...)

    으아악

    current.usercurrent_user

    과 단어 수가 같습니다.

    결과:

    으아악

    제 생각엔

    함수 호출에는 문제가 없습니다...
    그런데 이 문제(오브젝트 트릭을 사용하지 않고)를 어떻게 해결하는지 아시는 전문가가 계시다면 꼭 알려주세요!!


    내가 답변한 질문: Python-QA

    회신하다
    0
  • 阿神

    阿神2017-04-18 09:09:06

    flask_login이 이미 완료되지 않았나요?

    으아악

    이를 설정하면 current_user가 호출될 때마다 현재 사용자의 사용자 개체가 반환됩니다. 물론 사용자는 get_id() 메소드를 구현해야 합니다.
    참조: 플라스크_로그인

    회신하다
    0
  • 阿神

    阿神2017-04-18 09:09:06

    from Flask 가져오기 세션, 리디렉션, 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
  • 취소회신하다