Есть ли в Flask способ, чтобы несколько флажков вызывали разные функции для тега ввода HTML?

#python #html #flask

#python #HTML #flask

Вопрос:

У меня есть HTML-файл с тегом ввода и двумя флажками. В файле Python у меня есть две функции, предназначенные для работы с тегом ввода в зависимости от того, какой флажок установлен. По какой-то причине функция, предназначенная для вычисления содержимого gc, не работает; кажется, работает только первая функция. Как мне это исправить?

HTML-код

     <form action="" method='POST' >
        <input name="sequence" type="text"><br>
        <input type="checkbox" id= "count_nuc" name="check" value="check">
        <label for="count_nuc">Count nucleotides</label>
    
        <input type="checkbox" id= "gc_content" name="check" value="check">
        <label for="gc_content">GC content</label><br>
    
        <button type="submit" value="submit">Submit</button>
    </form>
            
    {% if gc_percent %}
    <p>GC Percent: {{gc_percent}}</p>
    {% endif %}
    {% if new_dict %}
    <p>Count nucleotides: {{new_dict}}</p>
    {% endif %}
 

Код Python

     from flask import Flask, render_template, request
    
    app = Flask(__name__)
    
    
    @app.route("/", methods=['POST', 'GET'])
    def count_nucleotides():
        new_dict = {}
        nucleotides = ['A', 'C', 'T', 'G']
        seq = request.form.get('sequence')
        if request.method == 'POST' and 'sequence' in request.form and request.form.get("check"):
            for i in seq:
                if i not in nucleotides:
                    return 'Invalid nucleotide(s) found'
                else:
                    for j in nucleotides:
                        if j == i:
                            new_dict[i] = seq.count(i)
        return render_template('calculator.html', new_dict=new_dict)
    
    
    def gc_content():
        gc_percent = 0
        seq = request.form.get('sequence')
        if request.method == 'POST' and 'sequence' in request.form and request.form.get("check"):
            gc_percent  = (round(((seq.count('G')   seq.count('C')) * 100 / len(seq)), 2))
        return render_template('calculator.html', gc_percent=gc_percent)
    
    
    app.run(debug=True)
 

Комментарии:

1. Я не вижу, где вы на самом деле вызываете gc_content() функцию.

2. Вы имеете в виду добавление «onclick = gc_content()» к одному из входных тегов?

3. onclick вызовет функцию JavaScript, а не функцию python. Возможно, вам потребуется переосмыслить свой дизайн и то, что вы пытаетесь сделать.

Ответ №1:

Хорошо, вся идея нуждается в пересмотре.

Во-первых, вам нужно иметь две страницы, одну для отображения формы, а другую для отображения результата.

итак, вам нужно создать два шаблона:

Шаблон формы (form.html )

     <form action="/submit" method='POST' >
        <input name="sequence" type="text"><br>
        <input type="checkbox" id="count_nuc" name="count_check" checked>
        <label for="count_nuc">Count nucleotides</label>
    
        <input type="checkbox" id="gc_content" name="gc_check" checked>
        <label for="gc_content">GC content</label><br>
    
        <button type="submit" value="submit">Submit</button>
    </form>
 

Шаблон результата (calculator.html )

     <h1>Result</h1>

    {% if gc_percent %}
    <p>GC Percent: {{gc_percent}}</p>
    {% endif %}
    {% if new_dict %}
    <p>Count nucleotides: {{new_dict}}</p>
    {% endif %}

 

Как вы можете видеть в приведенном выше коде, я также изменил ваш шаблон HTML, были некоторые ошибки в названии элементов флажка, которые должны отличаться друг от друга.

Код Python

   from flask import Flask, render_template, request
    
    app = Flask(__name__)
    
    
    @app.route("/", methods=['GET'])
    def form():
     
        return render_template('form.html')
    
    @app.route("/submit", methods=['POST'])
    def calculator():
        new_dict = {}
        nucleotides = ['A', 'C', 'T', 'G']
        seq = request.form.get('sequence')
        
        # Getting Value of Count Check Box
        if request.form.get("count_check"):
            count_check = True
            if count_check is True:
                for i in seq:
                    if i not in nucleotides:
                        return 'Invalid nucleotide(s) found'
                    else:
                        for j in nucleotides:
                            if j == i:
                                new_dict[i] = seq.count(i)
                            
                            
        gc_percent = 0
        # Getting Value of GC Check Box

        check = False
        if request.form.get("gc_check"):
            gc_check = True
            if gc_check is True:    
                gc_percent  = (round(((seq.count('G')   seq.count('C')) * 100 / len(seq)), 2))
            
        return render_template('calculator.html', gc_percent=gc_percent, new_dict=new_dict)
    
    
    app.run(debug=True)
 

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

Комментарии:

1. Спасибо, благодаря этому я смог добавить еще ~ 10 функциональных флажков. Спасибо за помощь!