Создайте ссылку со значениями utf-8 и передайте ее в маршрут Flask

Как я могу гарантировать, что следующая HTML-ссылка будет возвращать себя с utf-8 кодирование?

<meta http-equiv="REFRESH" content="5; URL=http://superhost.gr/files/download?filename={{ filename }}">

Как и сейчас, хотя значение имени файла извлекается из Flask как utf-8 это не формирует ссылку URL также как utf-8,

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

# Prepare selected file for download...
if request.args:
    filename = request.args.get('filename')         # value comes from template url link
    filepath = '/static/files/'
    return send_from_directory( filepath, filename, as_attachment=True )

Я пытаюсь сгенерировать ссылку с Jinja2 / Flask под модом Apache/WSGI.

Возможно, Apache под mod_wsgi вызывает эту проблему?!

Ошибка, которую я вижу в браузере:

Bad Request
The browser (or proxy) sent a request that this server could not understand.

Ссылка, созданная в соответствии с вкладкой Chrome Developer Tool/Network Tab для тестового файла со смешанным именем файла (греческий + английский):

http://superhost.gr/files/download?filename=%CE%94%CE%B7%CE%BC%CE%B9%CE%BF%CF%85%CF%81%CE%B3%CE%AF%CE%B1%20Win10%20Bootable%20Flash%20Disks.txt

1 ответ

Я пытаюсь воспроизвести вашу проблему, но думаю, что вы должны предоставить больше информации.

Я попытался настройки ниже и файл с именем Νικόλαος Βέργος.pdf правильно возвращается /redirect/,

app.py

from flask import render_template
from flask import Flask
from flask import request, send_from_directory
app = Flask(__name__)

@app.route('/')
def home():
    filename='Νικόλαος Βέργος.pdf'
    return render_template('home.html', filename=filename)

@app.route('/redirect/')
def redirect():
    if request.args:
        filename = request.args.get('filename')
        filepath = '/static/files/'
        return send_from_directory(filepath, filename, as_attachment=True)

шаблоны /home.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="REFRESH" content="5; URL=http://127.0.0.1:5000/redirect/?filename={{ filename }}">
    <title>title</title>
  </head>
  <body>
  </body>
</html>
Другие вопросы по тегам