Приложение Dockerized Flask выдает ошибку 400 при загрузке определенных файлов - PullRequest
0 голосов
/ 18 июня 2019

У меня то же самое приложение с докерской флягой на Debian VM без этой проблемы.Это только выдает ошибку 400 Bad Request на моем RPI 3B +.Оба ограничены одним ядром и 1 ГБ памяти.Я не могу понять, почему он бросает только 400 на пи.Как будто происходит сбой при доступе к request.form, даже при попытке инкапсуляции.с и без get () {request.form.get ('data', False)}

Я запускаю python3 в этом контейнере.

Это происходит только с размерами файлов выше около 50КБ, файлы размером 1 КБ работают, загрузка файлов не выполняется в форме «работа», но ошибка выдает более крупные файлы 400. Загрузка файла предназначена для работы с файлами .xlsx, размер которых обычно превышает 50 КБ.

/var / log / apache2 / error не регистрирует эту ошибку вообще.

eprint - это функция, которую я нашел для записи в stderr, и мой способ быстрой отладки в случае смерти этого приложения.

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

Я наблюдал за памятью на моем контейнере pi и отдельном докере, ни на одном из них не превышали лимитов памяти (с верхним и статусом докера).

Я удалил все контейнеры и образы, и 'docker-compose up' изЗемля.

Версия Docker:

Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:57:21 2018
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:17:57 2018
  OS/Arch:          linux/arm
  Experimental:     false

Dockerfile

############################################################
# Dockerfile to build Flask App
# Based on
############################################################

# Set the base image
FROM debian:latest

# File Author / Maintainer
MAINTAINER Carlos Tighe

RUN apt-get update && apt-get install -y apache2 \
    libapache2-mod-wsgi-py3 \
    build-essential \
    python3 \
    python3-dev\
    python3-pip \
    vim \
 && apt-get clean \
 && apt-get autoremove \
 && rm -rf /var/lib/apt/lists/*

# Copy over and install the requirements
COPY ./app/requirements.txt /var/www/apache-flask/app/requirements.txt
RUN pip3 install -r /var/www/apache-flask/app/requirements.txt

# Copy over the apache configuration file and enable the site
COPY ./apache-flask.conf /etc/apache2/sites-available/apache-flask.conf
RUN a2ensite apache-flask
RUN a2enmod headers

# Copy over the wsgi file
COPY ./apache-flask.wsgi /var/www/apache-flask/apache-flask.wsgi

COPY ./run.py /var/www/apache-flask/run.py
COPY ./app /var/www/apache-flask/app/

RUN a2dissite 000-default.conf
RUN a2ensite apache-flask.conf

EXPOSE 80

WORKDIR /var/www/apache-flask

# CMD ["/bin/bash"]
CMD  /usr/sbin/apache2ctl -D FOREGROUND
# The commands below get apache running but there are issues accessing it online
# The port is only available if you go to another port first
# ENTRYPOINT ["/sbin/init"]
# CMD ["/usr/sbin/apache2ctl"]

config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'configKEYgoesHERE'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    MAX_CONTENT_LENGTH = 16 * 1024 * 1024    #16MB

Python-код, который выдает ошибку 400 вбраузер

@app.route('/addMacs', methods=['GET', 'POST'])
@login_required
def addMacs():
    if not current_user.is_authenticated:
        return redirect(url_for('index'))

    if request.method == 'POST':                        # If POST, process request data
        eprint("--------")


        return str(request.form.get('data'))              # <---- Throws error 400, specifically
        eprint("---after Form0---")

        # requestForm = request.form.to_dict()            # Convert ImmutibleMultiDict (garbage) to normal Dict
        # eprint("---form0---")
        # data = list(requestForm.keys())                 # Get list of keys from form (get user-ids to unregister)
        # eprint("---form1---")
        # if len(data) != 0:                              # If request had a form, this will be non-zero
        #     eprint("---form2---")
        #     macs, error = supp_extractMacsForm(requestForm["data"])
        #     eprint("---form3---")
        #     # eprint(str(requestForm["data"]))
        #     eprint(str(macs))
        #     return "Form Received"

        eprint("---after Form---")
        if 'file' not in request.files:
            flash('No file uploaded.')
            return render_template('addMacs.html', title='Add MACs')
        file = request.files['file']
        if file.filename == '':
            flash('No file uploaded.')
            return render_template('addMacs.html', title='Add MACs')
        if file:
            filename = secure_filename(file.filename)


            return "File Received"

    return render_template('addMacs.html', title='Add MACs')

html-код для моего файла и текстовое сообщение.

<form action="" method="post">
    <legend>Add MAC Addresses by text:</legend>
    <textarea name="data" rows="7" cols="75" placeholder="Enter MAC Addresses here, separated by commas like so: AB:BA:CC:DD:EF:FE, AB:BA:CC:DD:EF:FF"></textarea>
    <input type="submit">
</form>

<form action="" method="post" enctype="multipart/form-data">
    <legend>Add MAC Addresses by file:</legend>
    <input type="file" name="file"/>
    <input type="submit">
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...