Я хочу, чтобы запрос MySQL, который я написал несколько недель назад, возвращал значения из базы данных на основе введенного запроса.
Вот HTML-скрипт:
<!DOCTYPE html>
<head>
<meta charset=UTF-8">
</head>
<p>
Search by gene product name
</p>
<form name="search" method="post" action="XXXX-CGISCRIPT-XXXX">
<input id="search_entry" type="text" name="search_entry">
<input type="submit" value="Search">
</form>
</body></html>
и вот скрипт CGI:
#!/usr/bin/env python3
import mysql.connector
import cgi
import jinja2
import re
from biocode import utils
import cgitb
def main():
cgitb.enable()
loadTemp = jinja2.FileSystemLoader(searchpath="./templates")
environs = jinja2.Environment(loader=loadTemp)
template = environs.get_template('search_template.html')
form = cgi.FieldStorage()
acc = form.getvalue('search_entry')
conn = mysql.connector.connect(user = 'XXX', password = 'XXX',
host = 'localhost', database = 'XXX_chado')
# MySQL query
qry = """SELECT f.uniquename, product.value, assem.uniquename, assem_type.name, g.fmin, g.fmax, g.strand
FROM feature f
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id
JOIN featureprop product ON f.feature_id=product.feature_id
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id
JOIN featureloc g ON f.feature_id=g.feature_id
JOIN feature assem ON g.srcfeature_id=assem.feature_id
JOIN cvterm assem_type ON assem.type_id=assem_type.cvterm_id
WHERE polypeptide.name = 'polypeptide'
AND productprop.name = 'gene_product_name'
AND product.value LIKE %s;"""
curs = conn.cursor()
curs.execute(qry, ('%' + acc + '%',))
for (f.uniquename, productprop.name) in curs:
print(template.render(curs=curs, accs=acc))
conn.close()
curs.close()
Я продолжаю получать 500 внутренних ошибок сервера, и я не совсем уверен, почему. Насколько я понимаю, search_entry
на стороне HTML (который работает) - это то, что пользователь вводит в поле поиска, которое обрабатывается CGI-скриптом. Затем запрос возвращается
form = cgi.FieldStorage()
acc = form.getvalue('search_entry')
, а затем прошел мимо
curs = conn.cursor()
curs.execute(qry, ('%' + acc + '%',))
для использования в предыдущем запросе MySQL. Последние несколько строк посылают переменные в шаблон (чей мост я пересечу, когда попаду туда) и закроем соединение.
Моя проблема, мне трудно понять, почему я продолжаю получать сообщение об ошибке «500 Internal Server Error». Я попытался сделать несколько изменений и поймал много ошибок, а также изменил форматирование, но безрезультатно. Если бы это была ошибка шаблона, я не думаю, что получил бы эту ошибку сервера, не так ли? Я думаю, что это ошибка CGI, и
import cgitb
...
cgitb.enable()
не работает, поэтому я не могу получить более подробное сообщение об ошибке, независимо от того, где я размещаю cgitb.enable()
или если оно у меня распечатано в файл на сервере.
Кто-нибудь замечает какие-либо очевидные ошибки кода, которые я мог бы исправить, чтобы хотя бы перестать получать ошибку? В целях полного раскрытия, это для школьного задания.