如何使用AJAX或类似的东西在Django中使用Python脚本?

2024-06-13 19:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在致力于一个物联网项目,它就像是学校和大学的智能考勤和无现金支付系统。我使用Raspberry Pi3作为我的客户机,DigitalOcean托管PostgreSQL和核心Django项目。除了树莓皮,我正在使用EM-18射频识别阅读器和R305指纹阅读器。现在,到目前为止,我已经构建了一个CLI实用程序来使用project,但是对于一个不太熟悉Linux或shell的人来说,这并不方便。在

现在我的问题在于我当前的代码逻辑。例如,如果我想将学生信息连同他们的RFID/指纹信息一起添加到数据库中,我首先扫描分配给他们的RFID标签。检查该标记是否已在数据库中,如果没有,则询问其信息。在这一步之后,我再次要求他们再次点击同一张卡来注册他们的指纹。所有这些过程在CLI上都没有任何问题。我不知道如何让操作员知道现在要执行哪个步骤。虽然我用Django构建了一个web界面,它既不友好也不交互式。我想我必须使用JSON/AJAX来实现这一点,但我不知道如何实现。在


Tags: 项目django信息数据库cli智能系统raspberry
2条回答

请不要把这当作一个答案来读,而更像是一个较长的评论;)

因此,首先阅读MVC概念(例如:https://djangobook.com/model-view-controller-design-pattern/)以了解web接口如何与其余代码交互。在

传统的django方式是

  1. 基于您的model创建一个form(在forms.py)中。在
  2. 您可以编写一些html来在网站上显示表单
  3. 验证views.py中的表单输入
  4. 将结果发回并显示(同样是html)

当你想用AJAX做这件事的时候,这需要做一些额外的工作,但是结果是值得的。(例如:How to POST a django form with AJAX & jQuery

您将调用您首先在urls.py文件(path('checkForm', views.checkForm, name='checkForm'),在django 2.0中)中初始化的特定url

url指向在views.py中定义的名为checkForm的函数(与本例中的url路径相同,但您可以随意调用它)。在这个函数中,您可以编写python代码或从那里调用函数来执行db请求、验证等。 返回包含代码结果的响应。在

success: function(data, status) { $('#whatever').html(data); alert("whatever"); }

“数据”是服务器的响应。 我希望我给了你一个正确方向的提示。如果你被困在什么地方,请问一下。在

另外,我不知道如何通过http发送指纹数据,请检查是否有库。在

x=data.read(12).decode("utf-8")
tag_id_in = x

这是错误代码,请去掉x。第一个x是一个错误的变量名,第二个是完全冗余的。 您还需要将print语句转换为logs或其他任何格式,但是打印不会让您走得太远。在

我终于明白了。我把这个过程分成多个部分。然后我调用AJAX来访问它。在

我的urls.py文件:

from django.conf.urls import url
from .views import tag, check_tagid, scan_tag

urlpatterns = [
    url(r'^tag/', tag, name="tag"),
    url(r'^check_tagid/', check_tagid, name="check_tagid"),
    url(r'^scan_tag/', scan_tag, name="scan_tag"),
]

我的views.py文件:

^{pr2}$

我的tag.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
</head>
<body>
    <center><h1><div id="tag_id">Scanning for tag</div></h1></center>
    <div id="if_exists"></div>


  <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>

<script type="text/javascript">
$(document).ready(function() {
    $.get("/scan_tag/", function(data) {
        console.log(data.tagid);
        var x = document.createElement("INPUT");
        x.setAttribute("id", "tag_id_in");
        x.setAttribute("type", "hidden");
        x.setAttribute("value", data.tagid);
        document.body.appendChild(x);
        // check tag
        tagid = $("#tag_id_in").val();
        console.log(tagid);
        $.ajax({
            type: "GET",
            url: "{% url 'check_tagid' %}",
            data: {
                'tagid': tagid
            },
            success: function(data) {
                if (data.is_taken) {
                    document.getElementById('tag_id').innerHTML = "Welcome "+data.student;
                } else {
                    document.getElementById('tag_id').innerHTML = "No student with this tag id found";
                }
            }
        });
    });
});
</script>


</body>
</html>

所有这些现在都如期进行。在

所以,/tag/是主要的切入点。现在在tag.html中,我对/scan_tag/使用jQueryget方法。它将返回RFID标签号。然后我在/check_tagid/上调用AJAX,它将根据学生是否在数据库中而定。在

相关问题 更多 >