【问题标题】:Send data by post from AngularJs to Django从 AngularJs 邮寄数据到 Django
【发布时间】:2018-02-09 09:03:03
【问题描述】:

我想通过 Http 请求将数据从 AngularJS 发送到后端(Django)。

我尝试了很多方法,但在 django 中接收请求时始终没有收到发送的数据。

在粘贴代码之前,我只是将项目中 AngularJS 中的配置更改为如下

var myApp = angular.module('myApp',[]).config(['$httpProvider', '$interpolateProvider', function ($httpProvider, $interpolateProvider) {
$interpolateProvider.startSymbol('{/');
$interpolateProvider.endSymbol('/}');
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';}]);

网址:

urlpatterns = [
     url(r'^save_comment/', views.save_comment, name='save_comment'),]

在 Angular 中发送 Https POST:

$scope.submit_comment = function () {

    $http({
        method: "POST",
        url: 'save_comment',
        data: $.param({
            'fish_id' : "1"
        })
    }).success(function (response) {
        console.log(response.result);
    }).error(function () {
        console.log("failed")
    }); }

在视图中接收请求

def save_comment(request):

    data = request.POST.get('fish_id')
    return JsonResponse({'result': data}, content_type="application/json", safe=False)

但我没有得到任何结果。控制台给了我这个错误:

POST http://127.0.0.1:8000/brain_browser/save_comment 500(内部 服务器错误)

那么我应该怎么做才能将 Post 数据从 Angular 发送到 Django?

先谢谢了。

【问题讨论】:

    标签: angularjs django


    【解决方案1】:

    不是答案,但您可以自己调试。将此添加到settings.py

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': True,
            },
        },
    }
    

    【讨论】:

      【解决方案2】:

      您的url: 'save_comment' 开头似乎缺少斜杠,因为您的网址需要http://127.0.0.1:8000/save_comment/,但由于缺少斜杠,您发送的是http://127.0.0.1:8000/brain_browser/save_comment

      因此,将 Javascript 中的 url 更改为 url: '/save_comment/'

      编辑:如果 csrf 令牌是问题,@bobleujr 的回答也可以解决问题。在我个人的 Angular/Django 项目中,我只是把它放在我的 javascript 的最顶部:

      myApp.config(['$httpProvider', function($httpProvider) {
          $httpProvider.defaults.xsrfCookieName = 'csrftoken';
          $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
      }]);
      

      第二次编辑:这应该是解决方案

      在你看来,这样做而不是data = request.POST.get('fish_id')

      body_unicode = request.body.decode('utf-8')
      data = json.loads(body_unicode)
      # Work with "data" from now on, i.e:
      print(data["fish_id"])
      

      这是因为request.body(你的参数)是字节串,而json.loads不接受字节串​​。

      还要确保在最顶部的视图中导入了json,如下所示:

      import json
      

      【讨论】:

      • 我还添加了 $httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';并没有工作。
      • @MariamAL-Kassar 您的服务器是否显示任何错误?是否有显示错误发生在哪一行的回溯?您还可以将print("TEST") 放在您的 save_comment 视图中,看看它是否会触发。打印将在您的服务器控制台中输出。
      • 我现在没有错误只是我无法获取数据..控制台中的数据为空:(我把它放在视图中,就像这样 data = request.POST.get(' fish_id') 但控制台中的数据为空:(
      • 也没有工作:(它进入错误函数并给我失败了
      • 很大,我把它放在文本文件里你可以在这里看到:dropbox.com/s/9z4jqawxzzsl51d/error.txt?dl=0
      猜你喜欢
      • 2015-10-31
      • 2012-05-18
      • 1970-01-01
      • 2017-10-30
      • 2018-01-24
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2016-05-12
      相关资源
      最近更新 更多