Неоднократно получая ошибку 500 на CGI-скрипте - внешний интерфейс HTML работает, но не CGI [MySQL] - PullRequest
0 голосов
/ 06 марта 2019

Я хочу, чтобы запрос 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() или если оно у меня распечатано в файл на сервере.

Кто-нибудь замечает какие-либо очевидные ошибки кода, которые я мог бы исправить, чтобы хотя бы перестать получать ошибку? В целях полного раскрытия, это для школьного задания.

...