#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 функциональных флажков. Спасибо за помощь!