Ответ 1
Рассмотрим приведенное ниже пример приложения, созданного мной для этого вопроса
from flask import Flask, request,
from flask_login import LoginManager
from flask_login.utils import login_required, current_user, login_user
app = Flask(__name__)
app.secret_key = 'super secret key'
app.config['SESSION_TYPE'] = 'filesystem'
login_manager = LoginManager()
login_manager.init_app(app)
class MyUser():
name = "tarun"
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return 10
@login_manager.user_loader
def load_user(user_id):
return MyUser()
@app.route("/login", methods=["POST"])
def login():
login_user(MyUser())
return "Authenticated"
@app.route("/", methods=["GET", "POST"])
@login_required
def index():
return "Authenticated " # + current_user
if __name__ == "__main__":
app.run(debug=True)
Существуют разные способы тестирования зарегистрированных потоков.
Отключить вход и @login_required
В этом случае вы не используете current_user
в вызове запроса и просто защитите поток для аутентифицированного пользователя. В этом случае вы можете использовать подход ниже
import flasktest as flaskr
class FlaskrTestCase(unittest.TestCase):
def setUp(self):
flaskr.app.testing = True
flaskr.app.config['LOGIN_DISABLED'] = True
flaskr.app.login_manager.init_app(flaskr.app)
self.app = flaskr.app.test_client()
def test_without_login(self):
res = self.app.post("/")
assert "Unauthorized" in res.data
В этом случае тест завершится неудачно, так как пользователь сможет получить доступ к аутентифицированному потоку. И current_user
будет установлен как анонимный пользователь. И это так же хорошо, как отключить @login_required
.
Тестирование с использованием фактического входа
Для этого вам нужно убедиться, что вы можете войти в свое приложение, используя POST, в конечную точку, где вы действительно заходите в систему
import unittest
import flasktest as flaskr
class FlaskrTestCase(unittest.TestCase):
def setUp(self):
flaskr.app.testing = True
self.app = flaskr.app.test_client()
def tearDown(self):
pass
def test_login(self):
self.app.post("/login")
res = self.app.get("/")
assert "Authenticated" in res.data
def test_without_login(self):
res = self.app.post("/")
assert "Unauthorized" in res.data
Это даже правильно установит current_user
. В моем случае я не принимал никаких параметров данных формы, в вашем случае вы будете использовать что-то вроде ниже
self.app.post('/login', data=dict(
username=username,
password=password
), follow_redirects=True)
Использование файлов cookie сеанса
В этом случае вы установите сеанс user_id
и _fresh
def test_login_session(self):
with self.app.session_transaction() as sess:
sess['user_id'] = '12'
sess['_fresh'] = True # https://flask-login.readthedocs.org/en/latest/#fresh-logins
res = self.app.get("/")
assert "Authenticated" in res.data
Это, в свою очередь, вызовет
@login_manager.user_loader
def load_user(user_id):
return MyUser()
Чтобы получить фактического пользователя на основе user_id
, предоставленного нами в сеансе 12