【问题标题】:How to use Ajax(?) in Django to update an image from the server如何在 Django 中使用 Ajax(?) 从服务器更新图像
【发布时间】:2015-09-17 03:16:58
【问题描述】:

这是我的简单模板:

{% extends "base.template" %}
{% load staticfiles %}

{% block title %}Status{% endblock %}
{% block content %}
    {% if status1 %}
      {% with "images/"|add:status1|add:".gif" as static_image %}
        <img src= "{% static static_image%}" width='100' height='100'/>
      {% endwith %}
    {% endif %}
    {% if status2 %}
      {% with "images/"|add:status2|add:".gif" as static_image %}
        <img src= "{% static static_image%}" width='100' height='100'/>
      {% endwith %}
    {% endif %}
    {% if status3 %}
      {% with "images/"|add:status3|add:".gif" as static_image %}
        <img src= "{% static static_image%}" width='100' height='100'/>
      {% endwith %}
    {% endif %}
    {% if status4 %}
      {% with "images/"|add:status4|add:".gif" as static_image %}
        <img src= "{% static static_image%}" width='100' height='100'/>
      {% endwith %}
    {% endif %}
{% endblock %}

这是我的看法:

def getStatus(request):
  status = get_template("template");
  stats = getStats()
  if len(stats) == 1:
    rtn = status.render(Context({'status':stats[0]}))
  elif len(stats) == 2:
    rtn = status.render(Context({'status1':stats[0],
                        'status2':stats[1]}))
  elif len(stats) == 3:
    rtn = status.render(Context({'status1':stats[0],
                        'status2':stats[1],
                        'status3':stats[2]}))
  elif len(stats) == 4:
    rtn = status.render(Context({'status1':stats[0],
                        'status2':stats[1],
                        'status3':stats[2],
                        'status4':stats[3]}))
  return HttpResponse(rtn)

这一切正常。 getStats() (在服务器端)的结果会定期更改,我想更改用户屏幕视图中显示的图像。我宁愿不使用 html 刷新和更新整个页面。我只想更新图像(并且仅在它实际更改时)。

我认为答案是 Ajax...我已经寻找了 Ajax 和 Django 的简单示例,但没有找到任何有意义的东西(对我来说)。任何建议都将受到欢迎。

编辑:
这是我的 urls.py:

from django.conf.urls import patterns, include, url
from garageMonitor.views import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
  url('time', currentTime),
)

这是我的 base.template:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>Garage Status</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

这是我的时间模板:

{% extends "base.template" %}
{% load staticfiles %}
{% block title %}Current Time{% endblock %}
  {% block content %}
    Here is time.template
    {{ time }}
    <onload="refresh()" src="/static/garageMonitor/scripts/refreshTime.js">
{% endblock %}

这是我的views.py:

import datetime
from time import gmtime, strftime
import os
from django.shortcuts import render_to_response
from django.contrib.auth import authenticate
from django.contrib.auth import login
from django.contrib.auth.models import User
from django.http import Http404
from django.http import HttpResponse
from django.template import Context
from django.template.loader import get_template

def currentTime(request):
  status = get_template("time.template");
  now = strftime("%H:%M:%S", gmtime())
  rtn = status.render(Context({'time':now}))
  return HttpResponse(rtn)

这是我的 refreshTime.js:

function refresh() {
  $.ajax({
    url: '{% url garageMonitor/monitor-test %}',
    success: function(data) {
      blah
      $('#test').html(data);
    }
    setInterval("refresh()", 1000);
  });
};

$(function(){
  refresh();
});

据我了解(并没有那么多!),文件 /static/garageMonitor/scripts/refreshTime.js 中的 refresh() 函数应该在时间页面加载时调用。然后该函数应该每秒调用一次。

页面加载正确,但没有刷新。我做错了什么?

【问题讨论】:

标签: python ajax django


【解决方案1】:
  1. 设置服务器端端点以接受发布请求
  2. 阅读ajax api from jquery

例如:

$.ajax({
    method: "POST",
    url: "url/path/some",
    data: { name: "John", location: "Boston" }
})
.done(function( msg ) {
    alert( "Data Saved: " + msg );
});

url:是服务器端的端点。

数据:请求正文的 json 数据。

方法:POST http 协议。

就这么简单。

你可以在用户点击按钮发送图片后调用这个ajax

【讨论】:

    【解决方案2】:

    使用Ajax 意味着您对服务器进行asynchronous javascript 调用。这可以通过页面内的javascript 脚​​本或链接文件来完成。该脚本会在您的服务器 url 上调用 GET 方法,这将返回更改后的数据。

    你(可能)需要的是,每隔几个时间间隔,

    1. 向服务器发送GET 请求以检查是否有任何更新
    2. 如果服务器以确认响应,则发送另一个 GET 请求以接收这些更新
    3. 使用更新的信息更新元素

    您需要在这里开发两件事 -

    ONE:发送ajax 请求和更新元素的javascript 代码(使用jQuery,因为它有助于使事情变得更简单)

    /** attach to document load or ready state */
    function update_stuff() {
        $.get('/server_url_check_updates/', function(data ,status) {
            if (data.has_updates === 'YES') {
                /** send request to get updated data */
                $.get('/server_url_get_updates/', function(data, status) {
                    /** update your elements */
                }
            }
        }
    }
    setTimeout(update_stuff, interval_in_seconds);
    

    两个。处理 GET 请求的服务器代码

    import json
    import HttpRequest
    
    # map to /server_url_check_updates/
    def check_for_updates(request):
        # see if it's a GET request
        if request.GET:
            has_updates = True # True/False depending on updates
            return HttpResponse(
                json.dumps({'has_updates': True, }),
                content_type="application/json")
    
    # map to /server_url_get_updates/
    def send_updates(request):
        if request.GET:
            # create dictionary of your objects
            dictionary_of_your_objects = {}
            data = json.dumps(dictionary_of_you_objects)
            # return them lumped together or as separate objects
            return HttpResponse(
                json.dumps({'updates': data, }),
                content_type="application/json")
    

    您可以添加额外的代码来检查GET 请求是否有效,两个函数只使用一个url(检查GET 参数以查看请求的内容)等。有关更多信息,请参阅以下链接对此:

    js/jquery/ajax

    javascript - ajax calls (w3schools)

    jquery - ajax calls (w3schools)

    jquery - GET (query)

    django

    django - request/response

    【讨论】:

    • 感谢您的意见 kicker86。我认为这就是我想要的,但不确定将 update_stuff 函数放在哪里。我相信你的意思是它应该在模板中?如果是这样,我不知道如何添加它。另外,我相信 urls.py 将需要 send_updates 和 check_for_updates 的条目?
    • 感觉你对javascript很陌生,在这种情况下,你可以得到一个关于如何在html页面中嵌入和使用js的快速教程。目前,答案是:您在 &lt;body&gt; 中声明一个包含 javascript 代码的 &lt;script&gt; 标记。每当您想启动自动刷新时,都需要调用该函数。如果您希望它在页面加载后立即启动,请输入 document on load 函数。如果您希望它在按下按钮时启动,请将其放在该按钮的 onClick 处理程序中。您可以搜索这些术语以了解它们并获取示例。
    • 你说得对,javascript 不是我的强项(现在,我不需要它 ;-) 我应该把它放在我的 Django 模板的什么位置?我在这里没有使用按钮,所以我不需要那个部分(只是图像的定期刷新。)
    • 我不想要求被灌输,但我真的只有一页,其中只有一张图片,如果图片发生变化,需要更新。我正在努力让这个项目继续下去,它有很多方面,网页只是一小部分,我还有更多的部分需要整合。如果有必要,我会在 html 中放一个刷新标签,每秒更新整个页面,但看起来很俗气。如果有人可以具体说明如何使用 Django 进行此操作,我将不胜感激。
    • 如果您需要更多特定于代码的帮助而不仅仅是有用的指针,您可以将您的 github 存储库链接发送给我,我将提交 PR 以及我建议的更改。对于答案:您可以查看如何使用 javascript 或 jQuery 在文档加载时执行函数,然后在文档加载时每 xx 秒执行一次 ajax 调用。
    猜你喜欢
    • 2021-03-24
    • 2020-12-27
    • 2015-04-19
    • 1970-01-01
    • 2022-01-22
    • 2011-01-13
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    相关资源
    最近更新 更多