【问题标题】:Django + Angular: how to send angularjs $http data or params to django and interpret in django?Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 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 angularjs


【解决方案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 更优雅:stackoverflow.com/questions/18156452/…
猜你喜欢
  • 2012-05-18
  • 2019-01-18
  • 2018-01-24
  • 2013-09-09
  • 2015-02-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多