.py视图函数
import nmap
@app.route('/monitor/<id>')
def monitor(id):
if id == '113':
nm = nmap.PortScannerYield()
hosts = {}
lists = []
for i in nm.scan(hosts='113.105.7.40/25', arguments='-p80'):
hosts[i[0]] = i[1]
lists.append(i[0])
return (render_template('monitor.html',hosts=hosts,lists=lists))
.html
{% extends 'base.html' %}
{% block main_content %}
<div class="row">
<a href="{{ url_for('monitor',id = 113) }}" class="btn btn-default" title="113">IP-113</a>
<a href="{{ url_for('monitor',id = 116) }}" class="btn btn-default" title="116">IP-116</a>
<a href="{{ url_for('monitor',id = 211) }}" class="btn btn-default" title="211">IP-211</a>
<div id="content"></div>
</div>
{% for a in lists %}
<span class="label label-{{ 'success' if hosts[a]['nmap']['scanstats']['uphosts'] == '1' else 'danger'}}">{{ a }}</span>
{% endfor %}
{% endblock %}
想法是通过我的web页面按钮传值id=113到我的服务器,服务器接收到id后开始调用python-nmap模块进行ip扫描,我把扫描结果整理分为ip列表lists和ip字典表hosts,再把这两个表参数传递到client端,client端通过循环语句遍历出所有ip的地址以及地址是否可用,可用的为绿色,不可用为红色。
问题:
当我的地址范围为/26掩码时我的client还能正常加载出来,可是当我的的掩码为/24位的时候服务器端就需要更长的时间才能跑完数据,可是这时候我的client端早就已经504超时了,有什么方法可以解决呢?我希望做到的最好效果的是服务器端每计算出一条数据我的页面就呈现一条数据直至所有数据呈现,有人说ajax可以实现,可是我看了下ajax它实现的应该是页面局部更新,虽然我的主页面不需要刷新,可是局部页面的等待时长太长应该也会超时才对。而且我也试过了,并没有实现出来。
celery + flask-socketio
celery任务队列将nmap放到异步队列中,再通过websocket发送实时数据。