从标题,我试图实现一个外部python代码到Django web服务器。
我对编程很陌生,所以任何提示肯定会有帮助。
长话短说:我试图建立一个用户必须插入氨基酸序列的形式。这个序列应该传递给我的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('****************************nnn')
如前所述,任何关于如何设置这个的评论将是非常感谢的。如果你需要更多的文件或信息来回答我的问题,请提出来。因此,如果您在向表单提交序列后正确地遵循文档,则代码应该"进入";视图的if request.method == 'POST'
部分。您可以通过在if(或import pdb; pdb.set_trace()
)下放置print("hello world")
语句来验证这一点。在那里,您可以从sequence = form.cleaned_data['sequence']
的形式中获得序列。现在要把它传递给你的脚本,你需要你的脚本是一个可以接受输入(序列)的方法,所以把你的脚本包装在像def findMostSimilarSequence(sequence):
这样的东西中,并删除第一行sequence = sequence
,然后在你的视图中,你可以导入方法,并从你的表单中调用序列变量。