gpt4 book ai didi

python - 如何在 Flask 模板中模拟 `current_user`?

转载 作者:太空狗 更新时间:2023-10-30 02:07:52 24 4
gpt4 key购买 nike

我想在模板渲染下模拟flask-logincurrent_user。此函数返回当前登录的用户。

现在我正在模拟 flask-login 中的 AnnonymousUserMixin,如果用户未通过身份验证,它会默认返回。但这会导致各种杂耍。如果我可以简单地模拟 current_user,我就可以创建一个 Mocked 对象让它返回。

这是我今天使用的示例:

import unnittest
from flask_login.mixins import AnonymousUserMixin


class TestFoo(unittest.TestCase):
@patch.object(AnonymousUserMixin, 'is_admin', create=True,
return_value=False)
@patch.object(AnonymousUserMixin, 'is_authenticated', return_value=True)
def test_user_restriction(self, *args):
...

问候,

最佳答案

好的。我找到了答案。

flask-login 会要求您使用 login_manager.init_app(your_app) 初始化一个 LoginManager 实例。当您执行此操作时,它会将 current_user 添加到您的应用程序上下文处理器中。这发生在 flask_login.utils._user_context_processor 函数中,定义为

def _user_context_processor():
return dict(current_user=_get_user())

这里 _get_user 是在同一个模块中定义的。我对 current_user 所做的模拟是在 flask_login.utils 中模拟 _get_user

这是一个如何完成的工作示例。我正在打印响应内容,以便人们可以看到不同的结果。真正的测试不会手动实例化 Test 类,应该使用 unittest.main 或适当的东西。

from flask import Flask, render_template_string as render_string
from flask_login import LoginManager, UserMixin

app = Flask(__name__)
loginmgr = LoginManager(app)
loginmgr.init_app(app)


class User(UserMixin):
pass


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


@app.route('/')
def index():
return render_string('Hello, {{ current_user | safe }}')


if __name__ == '__main__':
import unittest
from unittest import mock

class Test:
def test(self):
client = app.test_client()
response = client.get('/')
data = response.data.decode('utf-8')
print(data)

@mock.patch('flask_login.utils._get_user')
def test_current_user(self, current_user):
user = mock.MagicMock()
user.__repr__ = lambda self: 'Mr Mocked'
current_user.return_value = user
client = app.test_client()
response = client.get('/')
data = response.data.decode('utf-8')
print(data)


t = Test()
t.test()
t.test_current_user()

这是它的输出:

Hello, <flask_login.mixins.AnonymousUserMixin object at 0x7f9d5ddaaf60>
Hello, Mr Mocked

问候,

关于python - 如何在 Flask 模板中模拟 `current_user`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com