Надсилання даних із HTML-форми до сценарію Python у Flask


84

У мене є код нижче в моєму сценарії Python:

def cmd_wui(argv, path_to_tx):
    """Run a web UI."""
    from flask import Flask, flash, jsonify, render_template, request
    import webbrowser
    app = Flask(__name__)


    @app.route('/tx/index/')
    def index():
        """Load start page where you select your project folder
        or load history projects from local DB."""
        from txclib import get_version
        txc_version = get_version()
        prj = project.Project(path_to_tx)

        # Let's create a resource list from our config file
        res_list = []
        prev_proj = ''
        for idx, res in enumerate(prj.get_resource_list()):
                hostname = prj.get_resource_host(res)
        username, password = prj.getset_host_credentials(hostname)
        return render_template('init.html', txc_version=txc_version, username=username)

Крім того, у мене є форма HTML у init.html:

<form>
<input type="text" id="projectFilepath" size="40" placeholder="Spot your project files">
<input type="button" id="spotButton" value="Spot">
</form>

Як я можу передати користувацькі дані із "projectFilepath", коли користувач натискає "spotButton" на змінну в моєму сценарії python?

Я новачок у Python і Flask, тому пробачте мене, якщо я роблю помилки.


1
Для вашого projectFilepathвведення повинен бути встановлений nameатрибут - тоді ви зможете отримати доступ до значення в request.args.value_of_name(або request.form.value_of_nameякщо робите POSTзапит.
Sean Vieira

2
Я хотів назвати тонкощі, що ви використовуєте idатрибут на <input>тезі, тоді як відповіді нижче використовують name. nameце те, що ви хочете, оскільки це те, що проходить як ключі request.form.
Трентон,

Відповіді:


154

formТег повинен встановити деякі атрибути:

  1. action: URL-адреса, на яку надсилаються дані форми при надсиланні. Створіть його за допомогою url_for. Його можна опустити, якщо одна і та ж URL-адреса обробляє показ форми та обробку даних.
  2. method="post": Подає дані як дані форми методом POST. Якщо дані не вказані або явно встановлені get, дані подаються у рядок запиту ( request.args) із використанням методу GET.
  3. enctype="multipart/form-data": Коли форма містить вхідні файли, вона повинна мати цей набір кодування, інакше файли не завантажуватимуться, а Flask їх не бачитиме.

inputТег потрібен nameпараметр.

Додайте подання для обробки поданих даних, яке знаходиться request.formпід тим самим ключем, що і вхідні дані name. Будь-які введені файли будуть в request.files.

@app.route('/handle_data', methods=['POST'])
def handle_data():
    projectpath = request.form['projectFilepath']
    # your code
    # return a response

Встановіть для форми actionURL-адресу цього подання, використовуючи url_for:

<form action="{{ url_for('handle_data') }}" method="post">
    <input type="text" name="projectFilepath">
    <input type="submit">
</form>

7
methodє фактично необов’язковим - за замовчуванням GET. В іншому випадку ви на місці.
Шон Віейра,

4
Будучи нубом (буквально перший день працюючи над Flask), я спочатку не розумів, що потрібно робитиfrom flask import Flask, request
CodeFinity

3
Я вважаю за краще використовувати request.form.get('projectFilepath')замість того, request.form['projectFilepath']щоб уникнути отримання винятку, якщо надіслано нульове значення.
Ібрагім. H

2
Інша річ, на яку слід звернути увагу, - url_forце пошук функції з такою назвою, тому тут ваш вигляд повинен бути названийhandle_data
TrigonaMinima

57

Вам потрібен перегляд Flask, який отримає дані POST, і HTML-форма, яка їх надішле.

from flask import request

@app.route('/addRegion', methods=['POST'])
def addRegion():
    ...
    return (request.form['projectFilePath'])
<form action="{{ url_for('addRegion') }}" method="post">
    Project file path: <input type="text" name="projectFilePath"><br>
    <input type="submit" value="Submit">
</form>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.