【发布时间】:2018-12-08 22:47:21
【问题描述】:
我已经为此苦苦挣扎了几天。我已经阅读了很多关于 Django 项目的帖子、博客和观看视频演示,但没有什么能完全解决我的问题。
我有一个 Django webapp,它使用 Python API 连接到第三方服务来分析文本数据。用户写入文本区域,按下按钮,然后将文本发送到返回 JSON 对象列表的服务。对该服务的 API 调用是一个 Python 函数。我正在尝试使用 Ajax 在按下按钮时使用文本数据作为参数对 Python 函数进行异步调用。
我目前还没有尝试调用我的第三方服务。我只是想看看能否从 Python 发送输入和接收输出中得到响应。
我发现的大多数示例都涉及创建表单并提交它,以便 Django 框架自动调用它的 Python 函数。表单并不完全是我想要构建的,我也不想进入新页面查看结果或刷新当前页面。
<!-- index.html -->
<html>
<head>
<title>Test Data</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
document.getElementById("Button").addEventListener('click', analyzeText());
function analyzeText(){
var text = document.getElementById('text-to-analyze').value;
$ajax({
type: "POST",
url: "/models.py", /* Call python function in this script */
data: {param: text}, /* Passing the text data */
success: callback
});
}
function callback(response){
console.log(response);
}
</script>
</head>
<body>
<textarea id="text-to-analyze" rows="12" cols="100"></textarea><br>
<button id="button" value="Analyze"/>
</body>
</html>
# models.py
from django.db import models
# Function I want to call from Ajax
def testcall():
return 'test successfull'
编辑:
我几乎让它工作了。我只是遇到了我无法弄清楚的 ajax 语法错误。
Could not parse the remainder: ' 'ajax-test-view'' from 'url 'ajax-test-view''
编辑我修复了所有语法错误,但现在尝试执行目标 python 脚本时出现 404 错误。我现在了解了 Django 中的 url 和路径是如何工作的,但是使用 Kostadin Slavov 的解决方案,我如何在不路由到特定 html 的情况下做到这一点?
在 ajax 中,我将 url 设置为:
url: '{{ 'ajax-test-view' }}',
在我的 python 中,我的 url 模式设置如下:
path(r'^django-app/$', views.testcall, name = 'ajax-test-view'),
似乎 ajax url 中的变量指向 url 模式中的 name 字段,但这似乎也是要渲染的特定 html 文件的名称(?)或者它是 py 函数的名称?
当我点击我的按钮时,ajax 会向http://localhost:8000/what-ever-the-name-field-is-in-the-url-pattern 发送一个命令,我会从中得到一个 404。框架是在尝试加载页面还是意味着它找不到我的 python 文件?
Derp...重要的是要知道url: '{{ 'ajax-test-view' }}', 是ajax 将请求的url 地址,只有当路径完全匹配时,Django 的url 调度程序才会拦截它以执行其他操作。
最终编辑
得到它的工作。我在 Kostadin Slavov 的解决方案中更改了几件事:
# urls.py
urlpatterns = [
url(r'^$', views.index, name = 'index'),
path('my-ajax-test/', views.testcall),
]
<!-- index.html -->
<script>
....
var text = "test successful";
$.ajax({
type: "POST",
url: '{{ 'my-ajax-test/' }}',
data: { csrfmiddlewaretoken: '{{ csrf_token }}', text: text },
success: function callback(response){
console.log(response);
}
});
</script>
# views.py
def testcall(request):
return HttpResponse(request.POST['text'])
【问题讨论】: