сбой доступа к маршрутам, требующим аутентификации с помощью locust и flask_login - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь запустить скрипт саранчи на моем сайте, чтобы выполнить нагрузочные тесты.Я создал фиктивного пользователя на своем сайте и настроил этот скрипт для саранчи

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
        """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def on_stop(self):
        """ on_stop is called when the TaskSet is stopping """
        self.logout()

    def login(self):
        response = self.client.post("/auth/login", {"email": LOCUST_USER_EMAIL, "password": LOCUST_USER_PASSWORD})

    def logout(self):
        self.client.get("/auth/logout")

    @task(10)
    def index(self):
        self.client.get("/")

    @task(5)
    def access_protected_view(self):
        self.client.get("/protected_view")

class WebsiteUser(HttpLocust):
    host = "https://example.com"
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

Если я запускаю его с помощью веб-приложения саранчи, я получаю

 36     GET     /protected_view     HTTPError('403 Client Error: FORBIDDEN for url: https://example.com/protected_view',)

Я могувойдите в систему, используя учетные данные этого фиктивного пользователя, и без проблем наберите protected_view.Я использую flask_login для аутентификации моих пользователей, в частности

@auth.route('/auth/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user is not None and user.verify_password(form.password.data):
            login_user(user, form.remember_me.data)
            flash('Login successful.', 'success')
            next = request.args.get('next')
            if next is None or not next.startswith('/'):
                next = url_for('main.index')
            return redirect(next)
        flash('Invalid username or password.', 'warning')
    return render_template('auth/login.html', form=form)


@auth.route('/auth/logout')
@login_required
def logout():
    logout_user()
    flash("You have been succesfully logged out", 'success')
    return "logout" # "main blueprint

Я не знаю, есть ли что-то, но для моего защищенного представления используется декоратор, который требует группу пользователей (к которому мой фиктивный пользователь тоже имеет доступ)

from flask_login import current_user

def group_required(group):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_member_of(group) or current_user.is_anonymous:
                abort(403)
            return f(*args, **kwargs)
        return decorated_function
    return decorator

это украшает представление

@app.route('/protected_view')
@group_required('group1') # dummy user has access to group1
def protected_view():
    return "okay"

, чтобы подвести итог: как я должен получить доступ к защищенным представлениям с пользователями саранчи?Что мне здесь не хватает?

...