获取图表.js与 Django 和 Apache 一起工作



我有以下设置。我有一个简单的index.html通过 apache 提供服务。它如下所示。

<!DOCTYPE html>
<html lang='en'> <meta http-equiv="content-type" content="text/html; charset=UTF8"> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> </head> <body> <canvas id="myChart"></canvas> <script language="JavaScript" src="/customcharts.js"> </script> </body> </html>

以上所做的只是尝试在浏览器上放置折线图。它使用chart.js.为此,customcharts.js尝试连接到本地运行的django服务器。上面的 html 是通过在端口 8080 上运行的 apache 提供的,而 django 在端口 8090 上运行。

customcharts.js如下所示

function renderChart(data){
console.log(data)
console.log(data.labels)
defaultLabels = data.labels
defaultData = data.defaultData
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: defaultLabels,
datasets: [{
lineTension: 0,
label: 'Activity Profile',
data: defaultData,
}]
}
})
}
var endpoint = 'http://localhost:8090/polls/alice/'
var defaultData = []
var defaultLabels = []
$.ajax({
url: endpoint,
dataType: "JSONP",
success: renderChart,
method: 'GET'
}
);

此外,我django的观点是

def json_response(func):
"""
A decorator thats takes a view response and turns it
into json. If a callback is added through GET or POST
the response is JSONP.
"""
def decorator(request, *args, **kwargs):
objects = func(request, *args, **kwargs)
if isinstance(objects, HttpResponse):
return objects
try:
data = simplejson.dumps(objects)
if 'callback' in request.REQUEST:
# a jsonp response!
data = '%s(%s);' % (request.REQUEST['callback'], data)
return HttpResponse(data, "text/javascript")
except:
data = simplejson.dumps(str(objects))
return HttpResponse(data, "application/json")
return decorator
epoch = datetime.datetime.utcfromtimestamp(0)
r = redis.StrictRedis(host='localhost', port=6379, db=0)
threat_list = ['date', 'categories', 'mix']
@json_response
def index(request, uid):
print uid
uid = uid.rstrip('/')
_key = uid
retjsondict = {}
input_keys = [_key + ':' + x for x in threat_list]
k = input_keys[0]
retdict = {}
if r.exists(k):
retvalue = r.get(k).strip('"')
xdata_dt = [x.split(':')[0] for x in retvalue.split(' ')]
ydata_dt = [x.split(':')[1].rstrip(',') for x in retvalue.split(' ')]
retdict['defaultLabels'] = xdata_dt
retdict['defaultData'] = ydata_dt
print retdict
return JsonResponse(retdict)

index是真实的视图,json_response是装饰器。

但是,当我尝试使用http://localhost在浏览器上查看它时,出现以下错误

XMLHttpRequest 无法加载 http://localhost:8090/polls/alice/。不 "访问控制允许源"标头存在于请求的上 资源。因此,不允许访问源"http://localhost"。

有人可以指出我在做什么吗? 任何帮助/指示表示赞赏。

如果customcharts.jsstatic/yourapp内,则需要按如下方式加载脚本:

<script src="{% static 'yourapp/customcharts.js' %}"></script>

别忘了打电话{% load staticfiles %}

然后,静态资源无法调用视图,您需要获取视图中的 json 数据,然后将其传递给 javascript 函数。

模板应如下所示:

{% load staticfiles %}
<!DOCTYPE html>
<html lang='en'> 
<meta http-equiv="content-type" content="text/html; charset=UTF8">
<head> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
<script language="JavaScript" src="{% static 'yourapp/customcharts.js' %}"> </script>
<script language="JavaScript">
$.getJSON("{% url 'index' %}", function(data) {  // 'index' is the name of the view in your urls.py
renderChart(data);
});
</script>
</head> 
<body> 
<canvas id="myChart"></canvas>  
</body> 
</html>

希望这有帮助。

使用"polls"而不是"index">

最新更新