我正在尝试创建一个应用程序,我可以单击一列中显示的页面中的链接/按钮,并在另一列中显示html而不重新加载页面。我也试图以一种我可以拥有多个链接/按钮的方式来做到这一点,如果我点击不同的链接,它会改变显示。
到目前为止,我通过在绘图html上重绘整个页面来做到这一点,但它很慢。我的视图html看起来像那样
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!--// JQuery Reference, If you have added jQuery reference in your master page then ignore,
// else include this too with the below reference
-->
<script src="https://cdn.datatables.net/1.10.4/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.4/css/jquery.dataTables.min.css">
<link href="static/style.css">
<script type="text/javascript">
$(document).ready(function () {
$('#table_id').dataTable();
});
</script>
</head>
<body>
<div class="column" style="background-color:#aaa;">
<table id="table_id"
class="">
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
</thead>
<tbody>
<tr>
<td> <a href="javascript:plot1('par1', 'par2', 'par3');">Jill </a></td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td><a href="javascript:plot2('par1', 'par2', 'par3');">Eve </a</td>
<td>Jackson</td>
<td>94</td>
</tr>
</tbody>
</table>
<script type="text/javascript">
$(document).ready(function () {
$('#table_id').dataTable();
});
</script>
</div>
<div class="column2" style="background-color:#bbb;" id="targetColumn1">
<script>
function plot1(par1, par2, par3) {
var arr = ['/plot1?par1=', par1, '&par2=', par2, '&par3=', par3];
var urlcpar = arr.join('');
$.ajax({
type: "GET",
url: urlcpar,
success: function(response) {
$("#targetColumn1").html(response);
},
});
}
</script>
</div>
<div class="column3" style="background-color:#bbb;" id="targetColumn2" >
<script>
function plot2(par1, par2, par3) {
var arr = ['/plot2?par1=', par1, '&par2=', par2, '&par3=', par3];
var urlcpar = arr.join('');
$.ajax({
type: "GET",
url: urlcpar,
success: function(response) {
$("#targetColumn2").html(response);
},
error: function(xhr) {
//Do Something to handle error
}
});
}
</script>
</div>
</body>
</html>
我的CSS看起来像
<style>
* {
box-sizing: border-box;
}
body {
margin: 0;
}
.column {
float: left;
width: 100.0%;
padding: 10px;
height: 50.0%; /* Should be removed. Only for demonstration */
}
/* Create three equal columns that floats next to each other */
.column2 {
float: left;
width: 50.0%;
padding: 10px;
height: 50.0%; /* Should be removed. Only for demonstration */
}
/* Create three equal columns that floats next to each other */
.column3 {
float: right;
width: 50.0%;
padding: 10px;
height: 50.0%; /* Should be removed. Only for demonstration */
}
/* Clear floats after the columns */
.row:after {
content: "";
display: table;
clear: both;
}
/* Responsive layout - makes the two columns stack on top of each other instead of next to each other */
@media (max-width: 600px) {
.column {
width: 100%;
}
}
</style>
我的情节html 1看起来像
{{ html|safe }}
我的情节html 2看起来像
{{ plot|safe }}
我的应用是这样的,我有两个html,我想在同一页面显示
from flask import *
import os
import matplotlib.pyplot as plt
import numpy as np
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
# IF CHANGE THE ROUTE HERE FOR '/<eventid>' works
@app.route('/view/<eventid>')
def page_view(eventid):
global event
event = eventid
print(event)
return render_template('view.html')
@app.route("/plot1")
def plot1():
par1 = str(request.args.get('par1'))
par2 = str(request.args.get('par2'))
par3 = str(request.args.get('par3'))
fname = './static/'+event
if not os.path.exists(fname):
os.mkdir(fname)
f = open(fname+'/example.html', 'w+')
f.write('<HTML><p> \
<body>' \
+par1+par2+par3+'</p> \
<img src="./plot/test.png"> \
</body> </HTML>')
f.close()
#fl = fname+'/example.html'
#fl = 'http://visjs.org/examples/network/nodeStyles/images.html'
fl = fname+'/Network _ Images.html'
return render_template('plot1.html', html='<object width="100%" height="100%" data=\"'+fl+'\"></object>')
@app.route("/plot2")
def plot2():
par1 = str(request.args.get('par1'))
par2 = str(request.args.get('par2'))
par3 = str(request.args.get('par3'))
fname = './static/'+event
if not os.path.exists(fname):
os.mkdir(fname)
fname = fname+'/plot/'
if not os.path.exists(fname):
os.mkdir(fname)
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
plt.plot(t, s)
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
plt.savefig(fname+"/test.png")
fl = fname+'/test.png'
return render_template('plot2.html', plot='<img src=\"'+fl+'\">')
if __name__ == '__main__':
app.run()
非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用AJAX从服务器获取内容并在第二列中显示该内容。以下是说明此概念的示例应用程序:
<强> app.py 强>
from flask import Flask, render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
@app.route('/')
def page_view():
return render_template('view.html')
@app.route('/plot')
def plot():
return render_template('plot.html')
if __name__ == '__main__':
app.run()
<强>模板/ view.html 强>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$("a.loadPlot").click(function() {
args = $(this).data('args');
$.ajax({
type: "GET",
data: args,
url: "{{ url_for('plot') }}",
success: function(data) {
$('#targetColumn').html(data)
}
});
});
});
</script>
<style>
.column {
float: left;
width: 33.33%;
padding: 10px;
height: 300px; /* Should be removed. Only for demonstration */
}
</style>
</head>
<body>
<div class="column" style="background-color:#aaa;">
<a href="#" class="loadPlot" data-args='{"par1": 1, "par2": 4, "par3": 10}'>Plot 1</a><br />
<a href="#" class="loadPlot" data-args='{"par1": 5, "par2": 3, "par3": 5}'>Plot 2</a><br />
<a href="#" class="loadPlot" data-args='{"par1": 10, "par2": 9, "par3": 1}'>Plot 3</a><br />
</div>
<div class="column" style="background-color:#bbb;" id="targetColumn">
</div>
</body>
</html>
<强>模板/ plot.html 强>
Plot with args: <br /><br/ >
<ul>
{% for a in request.args %}
<li>{{ a }} - {{ request.args[a] }}</li>
{% endfor %}
</ul>
答案 1 :(得分:0)
答案不短,我只能用你提供的部分代码完全完成,但我可以给你一些指导,以便你可以继续。
更改/ PLOT路线以返回json而不是渲染模板。
@app.route('/plot')
def plot():
...
return flask.jsonify(jsongraph)
然后你需要将所有需要的库添加到你的第一个html中,所以包括plotly
js。之后,您需要添加ajax调用而不是按钮的链接:
<div class="column" style="background-color:#aaa;">
<span id="link">link text</span>
</div>
<div class="column" style="background-color:#bbb;" id="target">
<!-- DISPLAY SOMETHING HERE -->
</div>
并添加类似(jQuery中的示例)
<script>
$(document).ready(function(){
$.get('/ploty', function(data){
...
Plotly.plot(..., graph.data, graph.layout);
...
});
});
</script>
Idk如何完全按照情节工作,但你需要以某种方式向它提供target
div的id。也许您需要清除以前的div内容。