- Ubuntu搭建Apache2, 详情可以参考https://www.cnblogs.com/lovemo1314/p/5623762.html
- 编写HTML文件,用于与用户的交互信息。在该处的关键代码有两处:
1)在<script type="text/javascript"> </script>
代码区内定义function checkform()
函数,一般放在<head> </head>
代码区
2)在<body> </body>
代码区块加上<form role="form" name="myform" action="/cgi-bin/INSP/INSP.py" method="post" onsubmit="javascript:return checkform();" enctype="multipart/form-data"> </form>
代码。在该代码区内放入网页与用户的交互信息设置。
所有的HTML代码及图片,提供用户下载的文件都放在/var/www/html/
文件夹下。 - 编写含有cgi的主程序代码以及其他程序代码,全部放在
/var/www/cgi-bin/
及其子文件夹中。在该处主程序代码的cgi接口代码如下:
import cgi
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
seq_paste = form.getvalue('get1') #文本类的网页信息获取
fileitem = form['get2'] #文件类的网页信息获取
email_goal = form.getvalue('get5')
if fileitem.filename: #文件类的网页信息的名字及内容提取
with open(Folder +'seq.fasta', 'wb') as fw:
fw.write(fileitem.file.read())
#非阻塞运行方式的创建, 该种方式可能会使跳转页面不能快速出现
import subprocess
import threading
class my_thread(threading.Thread):
def __init__(self,job_id,email_goal):
super(my_thread, self).__init__()
self.job_id=job_id
self.email_goal=email_goal
def run(self):
p = subprocess.Popen(['python','/var/www/cgi-bin/INSP/server.py',str(self.job_id),self.email_goal], stderr=subprocess.STDOUT) #若是子进程中申明了运行环境,可将‘python’ 去除。该处是未申明环境且含有参数输入到子进程的情况。参数传递时,子进程只需加入import sys即可通过sys.argv[1]获取第一个参数,以此类推。
pid=os.fork()
if pid==0:
t=my_thread(job_id,email_goal)
t.start()
else:
#此处可添加提示页面等。
#python打印html页面
print("Content-type:text/html")
print("")
print('<html>')
print('<head>')
print('<meta charset="utf-8">')
print('<title>INSP</title>')
print('</head>')
print('<body>')
#添加打印内容。注意若是涉及到链接自己生成的页面不成功的时候,在网址前面将http://信息加入
print('</body>')
print('</html>')
至此,简单的网页制作基本完成。
附加:固定长度的表格的html的一些代码:
with open(filename, "w") as fr:
fr.write("<!DOCTYPE html>\n")
fr.write("\n")
fr.write('<html>\n')
fr.write('<head>\n')
fr.write('<meta charset="utf-8">\n')
fr.write('<title>INSP</title>\n')
fr.write('</head>\n')
fr.write('<body>\n')
fr.write('<table border="2" cellpadding="10" cellspacing="0" width=1830>\n')
for index, item in enumerate(result_merge):
fr.write('<tr><td colspan="3" style="word-wrap:break-word;word-break:break-all;" width=1830 >' + seq_names[
item[0]] + ':  ' + item[4] + '</td></tr>\n')
# consensus result
fr.write('<tr>\n')
fr.write('<td width=33%>\n')
fr.write('<table border="1" cellpadding="10" cellspacing="0" width=100%>\n')
fr.write('<caption><em><span style="color: #000; font-weight: bold;">Consensus</span></em></caption>\n')
fr.write(
'<tr><th width="40%">NLS</th><th width="20%">START</th><th width="20%">END</th><th width="20%">SCORE</th></tr>\n')
for i in range(len(item[1])):
fr.write('<tr><td style="word-wrap:break-word;word-break:break-all;">' + item[1][i][0] + '</td><td>' +
item[1][i][1] + '</td><td>' + item[1][i][2] + '</td><td>' + item[1][i][3] + '</td></tr>\n')
fr.write('</table>\n')
fr.write('</td>\n')
# machine without splicing result
fr.write('<td width=33%>\n')
fr.write('<table border="1" cellpadding="10" cellspacing="0" width=100%>\n')
fr.write(
'<caption><em><span style="color: #000; font-weight: bold;">Machine without splicing</span></em></caption>\n')
fr.write(
'<tr><th width="40%">NLS</th><th width="20%">START</th><th width="20%">END</th><th width="20%">SCORE</th></tr>\n')
for i in range(len(item[2])):
fr.write('<tr><td style="word-wrap:break-word;word-break:break-all;">' + item[2][i][0] + '</td><td>' +
item[2][i][1] + '</td><td>' + item[2][i][2] + '</td><td>' + item[2][i][3] + '</td></tr>\n')
fr.write('</table>\n')
fr.write('</td>\n')
# frequent result
fr.write('<td width=34%>\n')
fr.write('<table border="1" cellpadding="10" cellspacing="0" width=100%>\n')
fr.write('<caption><em><span style="color: #000; font-weight: bold;">Frequent</span></em></caption>\n')
fr.write(
'<tr><th width="40%">NLS</th><th width="15%">START</th><th width="15%">END</th><th width="15%">ENRICH</th><th width="15%">SCORE</th></tr>\n')
for i in range(len(item[3])):
fr.write('<tr><td style="word-wrap:break-word;word-break:break-all;">' + item[3][i][0] + '</td><td>' +
item[3][i][1] + '</td><td>' + item[3][i][2] + '</td><td>' + item[3][i][3] + '</td><td>' +
item[3][i][4] + '</td></tr>\n')
fr.write('</table>\n')
fr.write('</td>\n')
fr.write('</tr>\n')
fr.write('</table>\n')
fr.write('</body>\n')
fr.write('</html>\n')
附加:非阻塞运行方式的快速页面跳转方式
1)不同于上述的pid方式,该方法将上述跳转提示页面直接写在含有cgi的主程序中,一般放在获取网页信息后的代码之后,然后通过下面的代码来连接计算程序部分:
camdline='bash /home/server/INSP/INSP.sh '+str(job_id)+' '+email_goal
stdin, stdout, stderr = ssh.exec_command(camdline) #该处若是本地运行INSP.sh,可换成os.system(camdline)
INSP.sh内容如下:
$1 $2分别为第一个、第二个参数
#!/bin/bash
sh /home/server/INSP/tmpINSP.sh $1 $2 >/dev/null 2>&1 &
tmpINSP.sh内容如下:
#!/bin/bash
/home/server/INSP/main.py $1 $2
main.py即为计算程序