Как внедрить внешний python-код в веб-сервер Django?

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

Короче говоря: я пытаюсь создать форму, в которую пользователь должен вставить аминокислотную последовательность. Эта последовательность должна передаваться моему скрипту на python, который способен сравнить ее со всеми последовательностями, уже имеющимися в базе данных, и выдает в результате наиболее похожие. Моя проблема в том, что я не могу позволить моей форме и моему скрипту общаться друг с другом.
Я следовал документации Django здесь https://docs.djangoproject.com/en/3.2/topics/forms/, но это не слишком помогло.
Также блуждание в интернете и просмотр уже заданных здесь вопросов не принесло результатов.
Пожалуйста, найдите здесь ниже файлы:
BLAST_page.html (пробовал оба, с комментариями и без)

{% extends "base_generic.html" %}

{% block content %}
<div class="container-fluid" style="text-align: center;" ></div>
    <form method="post" action= {% url 'BLAST-process' %}>
        {% csrf_token %}
        {{ blast }}
        <label for="sequence">Type or paste your sequence in the box below</label><br><br> 
        <input type="text" id="sequence" class="input_text" name="sequence" value="{{ sequence }}" style="width:600px; height:200px;"><br><br>
        <input type="submit" value="Submit">
    </form>
</div>
    {% endblock %}    
<!--    
    <div class="container-fluid" style="text-align: center;" >
    <form method="POST" action= {% url 'BLAST-process' %}>
        {% csrf_token %}
    <label for="sequence">Type or paste your sequence in the box below</label><br><br>  
    <input type="text" id="sequence" class="input_text" name="sequence" value="{{ sequence }}" style="width:600px; height:200px;"><br><br>  
    <input type="submit" value="Submit">
    </form>
</div>
-->

Для того чтобы проверить, работает ли эта форма, я использовал этот простой скрипт .php. Смысл в том, что если форма работает правильно, то вставленные данные должны отображаться эхом. Но этого не происходит.

<html>
<body>

Sequence: <?php echo $_POST["sequence"]; ?><br>
<?php
    echo "<h2>Your Input:</h2>";
    echo $sequence;
    ?>
</body>
</html>

forms.py

from django import forms

class blast(forms.Form):
    sequence = forms.CharField(help_text="Enter a sequence", label='sequence')

blast.py скрипт, который должен получать данные из формы

from Bio.Blast.Applications import NcbiblastpCommandline
from io import StringIO
from Bio.Blast import NCBIXML
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio import SeqIO
import numpy as np

# Create two sequence files

#taken from the textArea.
sequence = sequence
seq1 = SeqRecord(Seq(sequence), id="x")

SeqIO.write(seq1, "seq1.fasta", "fasta")
#SeqIO.write(seq2, "seq2.fasta", "fasta")

# Run BLAST and parse the output as XML
output = NcbiblastpCommandline(query="seq1.fasta", 
                               subject="/Users/santarpia/Documents/tutorial/codorenv/RepOdor/FASTA/db.fasta",
                               outfmt=5)()[0]

blast_result_record = NCBIXML.read(StringIO(output))

# Print some information on the result
for alignment in blast_result_record.alignments:
    for hsp in alignment.hsps:
        print('***Alignment****\n')
        print('Alignment title', alignment.title)
        print('Alignment Length:', alignment.length)
        print('E-value:', hsp.expect)
        print('Gaps:', hsp.gaps)
        print('Identities:', hsp.identities)
        print('Positives:', hsp.positives)
        print('Score:', hsp.score)
        print('Bits:', hsp.bits)
        print('Coverage:', hsp.align_length)
        print('% Identity:', np.round((hsp.identities / hsp.align_length) * 100, 2))
        print("\n")
        print (hsp.query[0:])
        print("\n")
        print (hsp.match[0:])
        print("\n")
        print (hsp.sbjct[0:])
        print('****************************\n\n\n')

Как уже было сказано, любой комментарий о том, как это настроить, будет высоко оценен. Если вам нужны дополнительные файлы или информация для ответа на мой вопрос, не стесняйтесь просить их.

Итак, если вы правильно следовали документации, после отправки последовательности на форму код должен "войти" в часть представления if request.method == 'POST'. Вы можете проверить это, поместив оператор print("hello world") под if (или import pdb; pdb.set_trace()). После этого вы можете получить последовательность из формы с помощью sequence = form.cleaned_data['sequence']. Теперь, чтобы передать ее вашему скрипту, вам нужно, чтобы ваш скрипт был методом, который может принимать входные данные (последовательность), поэтому оберните ваш скрипт во что-то вроде def findMostSimilarSequence(sequence): и удалите первую строку sequence = sequence, затем в вашем представлении вы можете импортировать метод и вызвать его с переменной последовательностью из вашей формы.

Вернуться на верх