如何将外部 python 代码实现到 Django Web 服务器?

How to implement an external python code to a Django web server?

如标题所述,我正在尝试将外部 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' 部分。您可以通过在 if(或 import pdb; pdb.set_trace())下放置一个 print("hello world") 语句来验证这一点。在那里,您可以使用 sequence = form.cleaned_data['sequence'] 从表单中获取序列。现在要将它传递给你的脚本,你需要你的脚本是一个可以接受输入(序列)的方法,所以将你的脚本包装在 def findMostSimilarSequence(sequence): 之类的东西中并删除第一行 sequence = sequence 然后在你的查看您可以导入方法并使用表单中的序列变量调用它。