Невозможно передать параметры в вызов POST во время тестирования приложения Flask - PullRequest
0 голосов
/ 17 января 2019

У меня есть веб-приложение Flask, написанное и пишущее тестовые сценарии для одного и того же с использованием unittest. Ниже описано, как он обрабатывает маршрут signup

.

server.py

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    if current_user.__dict__.get('id', None):
        return render_template('login.html')

    if request.method == 'GET':
        return render_template('signup.html')

    else:
        data = request.get_json()
        username = data.get('username', '').lower()
        password = data.get('password', '')
        client = data.get('client', '')['name']
        confirm_password = data.get('confirm_password', '')

Внутри тестового файла есть вспомогательные методы для регистрации

test_unittesting.py

def signup(self, username, password, confirm, client):
    return self.app.post(
        '/signup',
        data=json.dumps(dict(username=username, password=password, confirm=confirm, client=client)),
        follow_redirects=True
    )

Но, похоже, это не работает. request.get_json() возвращается пустым. Параметры присутствуют в request.get_data(), а не в request.get_json(). Я не могу изменить вспомогательный метод для поддержки метода, определенного для маршрута. Что я должен изменить в тестовом файле, чтобы он работал как request.get_json()?

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Mimetype должен быть установлен на mimetype='application/json' в качестве дополнительного параметра внутри пост-вызова.

def signup(self, username, password, confirm, client):
    return self.app.post(
        '/signup',
        data=json.dumps(dict(username=username, password=password, confirm=confirm, client=client)),
        follow_redirects=True, mimetype='application/json'
    )
0 голосов
/ 18 января 2019
def signup(self, username, password, confirm, client):
    return self.app.post(
        '/signup',
        data=json.dumps(dict(username=username, password=password, confirm=confirm, client=client)), content_type='application/json')
0 голосов
/ 17 января 2019

Документы описывают атрибуты, доступные по запросу. В большинстве распространенных случаев request.data будет пустым, потому что он используется как запасной вариант:

request.data Contains the incoming request data as string in case it came with a mimetype Flask does not handle.

request.args: the key/value pairs in the URL query string
request.form: the key/value pairs in the body, from a HTML post form, or JavaScript request that isn't JSON encoded
request.files: the files in the body, which Flask keeps separate from form. HTML forms must use enctype=multipart/form-data or files will not be uploaded.
request.values: combined args and form, preferring args if keys overlap

Все это экземпляры MultiDict. Вы можете получить доступ к значениям, используя:

request.form['name']: use indexing if you know the key exists
request.form.get('name'): use get if the key might not exist
request.form.getlist('name'): use getlist if the key is sent multiple times and you want a list of values. get only returns the first value.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...