Я пишу серверное приложение Python, которое в конечном итоге будет использоваться для отправки сообщений на неопределенные в настоящее время конечные точки. Пока я жду определения требований, я попытался создать две конечные точки с помощью Flask только для проверки публикации на сервере.
Использование приведенного ниже кода приведет к возникновению ошибки в нижней части этого сообщения. .
Мой код отлично работает с файлами с такими расширениями, как .txt, .wav, .mp3. Я не тестировал свою реализацию сервера flask со всеми возможными расширениями файлов, а только с расширением файла, которое, как я знаю, мне, возможно, придется загрузить.
Я попытался просмотреть код Flask и Werkzeug, чтобы найдите причину проблемы, но я не могу найти ничего полезного. Есть ли файл конфигурации или параметр, который я могу установить, чтобы разрешить загрузку XML-файла?
Код: Выделить всё
from flask_uploads import UploadSet, configure_uploads, AUDIO, TEXT
ALLOWED_EXTENSIONS = {'xml', 'wav'}
app = Flask(__name__)
audio = UploadSet('audio', AUDIO)
docs = UploadSet('docs', TEXT)
app.config['UPLOADED_AUDIO_DEST'] = 'static/audio'
app.config['UPLOADED_DOCS_DEST'] = 'static/docs'
configure_uploads(app, (audio, docs))
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload-audio', methods=['GET', 'POST'])
def upload_audio():
if request.method == 'POST' and 'audiofile' in request.files:
filename = audio.save(request.files['audiofile'])
return "Audio file: '{}' uploaded successfully!".format(filename)
return ''' '''
@app.route('/upload-xml', methods=['GET', 'POST'])
def upload_xml():
if request.method == 'POST' and 'xmlfile' in request.files:
filename = docs.save(request.files['xmlfile'])
return "XML file: '{}' uploaded successfully!".format(filename)
return ''' '''
if __name__ == '__main__':
app.run(debug=True)```
HTTP/1.1 500 INTERNAL SERVER ERROR
Server: Werkzeug/3.0.1 Python/3.11.2
Date: Mon, 11 Mar 2024 18:23:53 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 16489
Connection: close
flask_uploads.exceptions.UploadNotAllowed
// Werkzeug Debugger
var CONSOLE_MODE = false,
EVALEX = true,
EVALEX_TRUSTED = false,
SECRET = "h1E...lX8";
UploadNotAllowed
flask_uploads.exceptions.UploadNotAllowed
Traceback (most recent call last)
[h4]File "/home/steve/.local/lib/python3.11/site-packages/flask/app.py",
line 1488,
in __call__) -> cabc.Iterable[bytes]:
"""The WSGI server calls the Flask application object as the
WSGI application. Это вызывает :meth:`wsgi_app`, который можно
обернуть для применения промежуточного программного обеспечения.
"""
return self.wsgi_app(environ, start_response)
^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
< br />
Файл "/home/steve/.local/lib/python3. 11/site-packages/flask/app.py",
строка 1466,
в [code]wsgi_app [/code]
попробуйте:ctx.push()
response = self.full_dispatch_request()
кроме исключения как e:
error = e
response = self.handle_Exception(e)
^^^^^^^^^^^^^^^^^^ ^^^^^^
кроме: # noqa: B001
< pre class="line after"> error = sys.exc_info()[1]
raise
return response(environ, start_response)
наконец:
Файл "/home/steve/.local/lib/python3.11/ site-packages/flask/app.py",
строка 1463,
в [code]wsgi_app
ctx = self.request_context(environ)ошибка: BaseException | Нет = Нет
попробуйте:
попробуйте:
ctx.push()< /pre>
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
кроме исключения как e:
error = e< br /> response = self.handle_Exceptionion(e)
< span class="ws"> кроме: # noqa: B001
error = sys. exc_info()[1]
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py"< /cite>,
строка 872,
в full_dispatch_request[/code]
< div class="source "> request_started.send(self, _async_wrapper=self.ensure_sync)rv = self.preprocess_request()
если rv имеет значение None:
rv = self.dispatch_request()
кроме исключения как e:
rv = self.handle_user_Exception(e)
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^
return self.finalize_request(rv)
def Finalize_request(
self,
rv: ft.ResponseReturnValue | HTTPException,
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py",
строка 870,
в [code]full_dispatch_request[/code]
попробуйте:< br /> request_started.send(self, _async_wrapper=self.ensure_sync)
rv = self.preprocess_request()
если rv имеет значение None:
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
кроме исключения как e:
rv = self.handle_user_Exception( e)
return self.finalize_request(rv)
def Finalize_request(< /pre>
Файл < cite class="filename">"/home/steve/.local/lib/python3.11/site-packages/flask/app.py",
line 855,
в [code]dispatch_request[/code]
< span class="ws"> и req.method == "OPTIONS"):
return self.make_default_options_response()
# в противном случае отправка обработчику для этой конечной точки
view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment]
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # тип: игнорировать [no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def full_dispatch_request(self ) -> Ответ:
"""Отправляет запрос и поверх который выполняет запрос
пред- и постобработку, а также перехват исключений HTTP и
обработка ошибок.
Файл "/home/steve/flask_endpoints.py",
строка 29,
в [code]upload_xml[/code]
return ''' '''< pre class="line before">@app.route('/upload-xml', методы=['GET', & #39;POST'])
def upload_xml():
if request.method == 'POST' и 'xmlfile' в request.files:
filename = docs.save(request.files['xmlfile&# 39;])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
верните "XML-файл: '{}&# 39; загружено успешно!".format(filename)
return '' ' '''
< pre class="line after">if __name__ == '__main__':
app.run(debug=True)
Файл "/home/steve/.local/lib/python3.11/site-packages/flask_uploads/flask_uploads .py",
строка 322,
в [code]сохранить[/code]
< br /> если Storage.filename имеет значение None:raise ValueError("Имя файла не должно быть пустым!")
basename = self.get_basename(storage.filename)
если не self.file_allowed(storage, basename):
поднимите UploadNotAllowed()
^^^^^^^^^^^^^^^^^^^^^ ^^^
< span class="ws"> if name:
if name.endswith(&# 39;.'):
basename = имя + расширение(базовое имя)
иначе:
flask_uploads.Exceptions.UploadNotAllowed
< p>
Это версия обратной трассировки, удобная для копирования и вставки.
Traceback (последний последний вызов):
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py", строка 1488, в __call__
return self.wsgi_app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py", строка 1466, в wsgi_app
ответ = self.handle_Exception(e)
^^^^^^^^^^^^^^^^^^^^^^^
Файл "/home/steve/.local /lib/python3.11/site-packages/flask/app.py", строка 1463, в wsgi_app
ответ = self.full_dispatch_request()
^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py& #34;, строка 872, в full_dispatch_request
rv = self.handle_user_Exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
Файл "/home/steve/.local/lib/python3.11/site-packages/flask/app.py", строка 870, в full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
Файл "/home/steve/.local/ lib/python3.11/site-packages/flask/app.py", строка 855, в диспетчерском запросе
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # введите: игнорировать[нет-возврата]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
Файл "/home/steve/flask_endpoints.py", строка 29, в upload_xml
имя_файла = docs.save(request.files[&# 39;xmlfile'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Файл "/home/steve/.local/lib/python3.11/site-packages/flask_uploads/flask_uploads.py", строка 322, в save
вызовите UploadNotAllowed()
flask_uploads.Exceptions.UploadNotAllowed
Отладчик обнаружил исключение в вашем приложении WSGI. Теперь вы можете
просмотреть обратную трассировку, которая привела к ошибке.
Если вы включите JavaScript, вы также сможете использовать дополнительные функции, такие как выполнение кода
(если функция evalex включена), автоматическая вставка
исключений и многое другое. подробнее.
Предоставлено пользователем НЕ ПАНИКОВАТЬ , ваш
удобный интерпретатор обратной трассировки на базе Werkzeug.
Консоль заблокирована
Консоль заблокирована, и ее необходимо разблокировать, введя PIN-код.
Вы можете найти PIN-код, распечатанный на стандартном выводе вашей
оболочки, на которой работает сервер.
PIN:
Источник: https://stackoverflow.com/questions/781 ... e-an-error