Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?
Posted
技术标签:
【中文标题】Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?【英文标题】:Django + Angular: how to send angularjs $http data or params to django and interpret in django? 【发布时间】:2014-09-06 03:17:31 【问题描述】:为什么我不能使用带有 $http 的参数或数据与 Django 通信?
我有一个从 django 视图获取数据的 angularjs 页面。在一种情况下,我有一个名为 /display 的 django 视图,它从服务器上抓取一个文件并将其显示为纯文本。
this.loadfile = function (clickedItem)
$http(method: 'GET' , url: '/display/'+ clickedItem.fileName)
.success(function(data)
$scope.fileView.text = data;
);
;
调用 /display/myfile.txt 效果很好,因为文件名是一个简单的字符串,返回的数据也是如此。
现在我需要向 django 发送一个更复杂的多行参数:一个 searchStrings 列表和一个文件名列表:
this.concord = function (searchStrings, filenames)
$http(method: 'GET' ,
url: '/concord/',
data: "searchStrings":searchStrings, "filenames":filenames
)
.success(function(data)
console.log(data); // log the data coming back.
$scope.concord = data;
);
;
根据AngularJS - Any way for $http.post to send request parameters instead of JSON?,应该可以使用
url(r'^concord/(?P<jsondata>.*)$', views.concord, name="concord"),
我的观点在哪里:
def concord(request,jsondata) :
jObj=simplejson.loads(jsondata)
return HttpResponse(jObj["files"])
(我也尝试解析 request.body;为空)
另一方面,如果我明确地将它附加到 url,我确实会得到一些回报:
$http(method: 'GET',
url: '/concord/'+JSON.stringify("searchStrings":searchStrings, "filenames":filenames),
)
.success(function(data)
console.log(data);
$scope.concordResults = data;
);
这行得通!
但我必须以最糟糕的方式这样做。有没有办法使用参数或数据与 Django 进行通信?
(PS:我已经避免使用 django-angular 包,因为我已经被学习包淹没了:django rest、angular、bootstrap 等......我真的只想从 angular 和 django 之间的基本通信开始。稍后我会深入研究更多的包。)
【问题讨论】:
django-rest-framework.org 谢谢——我已经开始阅读,但显然还不足以理解发布/获取的内容。 【参考方案1】:如果您查看 angularjs 文档 (https://docs.angularjs.org/api/ng/service/$http),您会发现在您的情况下,您可以获取参数并像 json 一样发布数据。
当你发帖时,你会做这样的事情:
$http.post('http://www.example.com/post_data_url',
'key': $scope.value
);
在 django 方面,不要在 URL 中添加任何参数,JSON 将在请求内部,更准确地说是在正文中:
import json
def concord(request):
dictionary = json.loads(request.body)
# to use the value, access the created dictionary
print dictionary['key']
[...]
【讨论】:
这里的主要区别是您使用的是 POST 而不是 GET;我会进一步测试它。目前,我得到 403 (FORBIDDEN) 的 POST (即使我在本地主机上,这可能是 crsf 问题)。我目前正在使用 JSON.stringify 方法运行它。一旦我弄清楚“禁止”问题,就会看看你的方法是否有效。 (谢谢!) 是的,做到了!我暂时输入了@csrf_exempt,并解决了该错误。谢谢!只是 GET 没有实体......(我猜)。现在是在 Angular 和 django 之间理解 csrf 的问题......(更多工作!) 好的,仅作记录:为了避免“禁止”,在我的 Django 视图中:从 django.views.decorators.csrf 导入 ensure_csrf_cookie,然后为每个与 angular 通信的(?)视图使用 @ensure_csrf_cookie . 已经有一个关于 angularjs/django 管理 csrf 的问题。答案很明确并且正在发挥作用。也比使用@ensure_csrf_cookie 更优雅:***.com/questions/18156452/…以上是关于Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?的主要内容,如果未能解决你的问题,请参考以下文章
如何将请求标头信息传递给 Angular6 应用程序(JWT 通过请求标头发送)
如何从 Angular 控制器或模块控制 toastr 选项(或全局设置)
Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?
如何将 Angular Material 图标资产路径与 Django 模板集成?