Flask: как включить данные локального хранилища в вызов функции flask

#javascript #flask #local-storage

#javascript #flask #local-storage

Вопрос:

Например, вот несколько строк кода в моем JS-коде, встроенном в HTML-файл:

 document.getElementById("enter").onclick = e => {
                e.preventDefault();
                var field1 = document.getElementById("field1").value;
                var field2 = document.getElementById("field2").value;
                var localStorageField = localStorage.getItem("field3");
                window.location.href = "{{ url_for("content", ???) }}"
                \ or something else? I think this line would most likely not work, because the url_for is filled in when the page is loaded, rather than when it is called.
            }
  

Как мне перенаправить страницу в content() функцию, где она получает field1 , field2 и localStorageField в качестве аргументов?

Редактировать: Когда я использовал ответ Тобина, возникает ошибка:

 Traceback (most recent call last):
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask_socketio/__init__.py", line 46, in __call__
    start_response)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/engineio/middleware.py", line 74, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/scythia/Desktop/Flask_LocalStorage/venv/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
TypeError: content() missing 3 required positional arguments: 'field1', 'field2' and 'local'
  

функция flask:

 app = Flask(__name__)
app.secret_key = os.getenv("SECRET_KEY")
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SESSION_PERMANENT'] = False
jsg = JSGlue(app)
@app.route("/")
def content(field1,field2,local):
    return render_template("index.html", field1 = field1, field2 = field2, local = local)
  

Ответ №1:

Я предлагаю вам использовать Flask-JSGlue: это позволяет вам правильно подключить ваше приложение Flask к интерфейсу.

УСТАНОВКА:

 $ pip install Flask-JSGlue
  

ИСПОЛЬЗОВАНИЕ:

Серверная часть:

 from flask import Flask
from flask_jsglue import JSGlue

app = Flask(__name__)
jsglue = JSGlue(app)
  

Интерфейс:

  • В <head>

       {{ JSGlue.include() }}
      
  • В вашем JS-коде:

       document.getElementById("enter").onclick = e => {
          e.preventDefault();
          var field1 = document.getElementById("field1").value;
          var field2 = document.getElementById("field2").value;
          var localStorageField = localStorage.getItem("field3");
          location.href = Flask.url_for("content", {param1: field1, param2: field2, param3: localStorageField});
      }
      

МАРШРУТ FLASK:

 from flask import request

@app.route('/', methods=['GET', 'POST'])
def content():
    field1 = request.args.get('param1')
    field2 = request.args.get('param2')
    local = request.args.get('param3')
    return render_template("index.html", field1=field1, field2=field2, local=local)