Ajax подгрузка графа networkx из flask - Python

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, товарищи! Недавно начал изучение networkx/flask, столкнулся с задачей написания динамической(с ajax) подгрузкой графа на сайт. В итоге потерпел крушение и разочарование при попытке создания. Networkx прекрасно грузится на сайт, обрабатывается великолепной библиотекой d3, все замечательно, пока не пробую загружать динамически появляющийся json файл с графом. Мало того! У динамически не получается даже загрузить банальный json пакет. Без штукатурки сейчас это выглядит вот так:
Листинг программы
  1. import networkx as nx
  2. from networkx.readwrite import json_graph
  3. from flask import Flask, jsonify, render_template, request
  4. app = Flask(__name__)
  5.  
  6. @app.route('/_add_numbers')
  7. def add_numbers():
  8. """Add two numbers server side, ridiculous but well..."""
  9. #a = request.args.get('a', 0, type=int)
  10. G = nx.barbell_graph(6, 3)
  11. # this d3 example uses the name attribute for the mouse-hover value,
  12. # so add a name to each node
  13. for n in G:
  14. G.node[n]['name'] = n
  15. # write json formatted data
  16. d = json_graph.node_link_data(G) # node-link format to serialize
  17. return jsonify(d)
  18.  
  19. @app.route('/')
  20. def index():
  21. return render_template('index.html')
  22. if __name__ == '__main__':
  23. print('\nGo to [url]http://localhost:8000/[/url] to see the example\n')
  24. app.run(port=8000)
Листинг программы
  1. <!doctype html>
  2. <title>jQuery Example</title>
  3. <script type="text/javascript"
  4. src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  5. <script type="text/javascript">
  6. var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
  7. $(function() {
  8. var submit_form = function(e) {
  9. $.getJSON($SCRIPT_ROOT + '/_add_numbers', {
  10. a: $('input[name="a"]').val()
  11. }, function(data) {
  12. $('#result').text(data.result);
  13. });
  14. return false;
  15. };
  16. $('button#calculate').bind('click', submit_form);
  17. $('input[type=text]').bind('keydown', function(e) {
  18. if (e.keyCode == 13) {
  19. submit_form(e);
  20. }
  21. });
  22. });
  23. </script>
  24. <h1>jQuery Example</h1>
  25. <p>
  26. <input type="hidden" value="1" name="a">
  27. <div id="result">?</div>
  28. <p><button href=# id="calculate">calculate server side</button>
И подлый <div> вообще не хочет меняться!!! помогите принести мир и свет в это облако мрака, буду премного благодарен! P.S. читал: http://ru.code-maven.com/echo-with-flask-and-python http://flask.pocoo.org/docs/0.11/patterns/jquery/ JS знаю от слова нет.

Решение задачи: «Ajax подгрузка графа networkx из flask»

textual
Листинг программы
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4.     <meta http-equiv="content-type" content="text/html; charset=utf-8">
  5.  
  6.     <title>flask+d3 Hello World</title>
  7.  
  8.     <script src="http://d3js.org/d3.v2.js"></script>
  9.     <style>
  10.  
  11. .axis {
  12.     shape-rendering: crispEdges;
  13. }
  14.  
  15. .axis line, .axis path {
  16.     stroke-width: 1px;
  17.     stroke: #000;
  18.     fill: none;
  19. }
  20.  
  21. circle.node {
  22.   stroke: #fff;
  23.   stroke-width: 1.5px;
  24. }
  25.  
  26. line.link {
  27.   stroke: #999;
  28.   stroke-opacity: .6;
  29. }
  30.  
  31.  
  32.  
  33.     </style>
  34.  
  35. </head>
  36. <body>
  37.  
  38.         <form action="/">
  39.              <input type="hidden" name="next" value=1>
  40.             <input type="submit" value="Next step">
  41.         </form>
  42.  
  43.     <div id="plot">
  44.     </div>
  45.     <script>
  46.  
  47.         // Set up the plot window.
  48.         var margin = 30;
  49.         var w = 700 - 2 * margin, h = 500 - 2 * margin;
  50.         var svg = d3.select("#plot").append("svg")
  51.                         .attr("width", w + 2 * margin)
  52.                         .attr("height", h + 2 * margin)
  53.                     .append("svg:g")
  54.                         .attr("transform", "translate(" + margin + ", " + margin + ")");
  55.  
  56.         // Axes scaling functions.
  57.         var xscale = d3.scale.linear().range([0, w]);
  58.         var yscale = d3.scale.linear().range([h, 0]);
  59.  
  60.         // The axes objects themselves.
  61.         var xaxis = d3.svg.axis().scale(xscale).ticks(8);
  62.         var yaxis = d3.svg.axis().scale(yscale).ticks(8).orient("left");
  63.  
  64.         svg.append("svg:g").attr("class", "x axis")
  65.                            .attr("transform", "translate(0, " + h + ")");
  66.         svg.append("svg:g").attr("class", "y axis");
  67.  
  68.  
  69.  
  70.  
  71.         // Load the data.
  72.         var callback = function (data) {
  73.  
  74.  
  75.             // Insert the data points.
  76.             fill = d3.scale.category20();
  77.  
  78.  
  79.           var force = d3.layout.force()
  80.                       .charge(-120)
  81.                       .linkDistance(30)
  82.                       .nodes(data.nodes)
  83.                       .links(data.links)
  84.                       .size([w, h])
  85.                       .start();
  86.  
  87.  
  88.           var link = svg.selectAll("line.link")
  89.               .data(data.links)
  90.             .enter().append("svg:line")
  91.               .attr("class", "link")
  92.               .style("stroke-width", function(d) { return Math.sqrt(d.value); })
  93.               .attr("x1", function(d) { return d.source.x; })
  94.               .attr("y1", function(d) { return d.source.y; })
  95.               .attr("x2", function(d) { return d.target.x; })
  96.               .attr("y2", function(d) { return d.target.y; });
  97.  
  98.           var node = svg.selectAll("circle.node")
  99.               .data(data.nodes)
  100.             .enter().append("svg:circle")
  101.               .attr("class", "node")
  102.               .attr("cx", function(d) { return d.x; })
  103.               .attr("cy", function(d) { return d.y; })
  104.               .attr("r", 5)
  105.               .style("fill", function(d) { return fill(d.group); })
  106.               .call(force.drag);
  107.  
  108.           node.append("svg:title")
  109.               .text(function(d) { return d.name; });
  110.  
  111.  
  112.  
  113.             svg.style("opacity", 1e-6)
  114.                 .transition()
  115.                   .duration(1000)
  116.                   .style("opacity", 1);
  117.  
  118.           force.on("tick", function() {
  119.             link.attr("x1", function(d) { return d.source.x; })
  120.                 .attr("y1", function(d) { return d.source.y; })
  121.                 .attr("x2", function(d) { return d.target.x; })
  122.                 .attr("y2", function(d) { return d.target.y; });
  123.  
  124.             node.attr("cx", function(d) { return d.x; })
  125.                 .attr("cy", function(d) { return d.y; });
  126.   });
  127.  
  128.         };
  129.  
  130.             d3.json("/gdata", callback);
  131.  
  132.  
  133.     </script>
  134.  
  135. </body>
  136. </html>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут