当前位置: 首页 > 面试题库 >

如何使用Django和AngularJS创建POST请求(包括CSRF令牌)

夏侯英纵
2023-03-14
问题内容

我正在尝试使用angular.js创建一个POST请求到这个Django视图。

class PostJSON4SlickGrid(View):
    """
    REST POST Interface for SlickGrid to update workpackages
    """

    def post(self, request, root_id, wp_id, **kwargs):
        print "in PostJSON4SlickGrid"
        print request.POST
        return HttpResponse(status=200)

因此,我创建了此资源。

myModule.factory('gridData', function($resource) {
    //define resource class
    var root = {{ root.pk }};
    return $resource('{% url getJSON4SlickGrid root.pk %}:wpID/', {wpID:'@id'},{
            get: {method:'GET', params:{}, isArray:true},
            update:{method:'POST'}
    });
});

在控制器中调用 get 方法可以正常工作。网址已翻译为http://127.0.0.1:8000/pm/rest/tree/1/

function gridController($scope, gridData){
    gridData.get(function(result) {
        console.log(result);
        $scope.treeData = result;
        //broadcast that asynchronous xhr call finished
        $scope.$broadcast('mySignal', {fake: 'Hello!'});  
    });
}

我在执行更新/ POST方法时遇到问题。

item.$update();

该网址已转换为http://127.0.0.1:8000/pm/rest/tree/1/345,其中缺少一个斜杠。如果在URL定义中不使用斜杠,可以很容易地避免这种情况。

url(r'^rest/tree/(?P<root_id>\d+)/(?P<wp_id>\d+)$', PostJSON4SlickGrid.as_view(), name='postJSON4SlickGrid'),

代替

url(r'^rest/tree/(?P<root_id>\d+)/(?P<wp_id>\d+)/$', PostJSON4SlickGrid.as_view(), name='postJSON4SlickGrid'),

使用不带斜杠的变通方法,我现在得到403(禁止)状态代码,这可能是由于我未在POST请求中传递CSRF令牌。因此,我的问题归结为如何将CSRF令牌传递到由angular创建的POST请求中?

我知道这种方法来传递CSRF令牌通过头,但我找了可能性
令牌添加到POST请求的身体,如建议在这里。是否有可能向发布请求正文中添加数据?

作为其他阅读材料,您可以查看关于资源,删除的尾部斜杠和资源当前具有的限制的这些讨论:disc1和disc2。在其中一个讨论中,一位作者建议当前不使用资源,而应使用这种方法。


问题答案:

您不能像这样拨打电话:

$http({
    method: 'POST',
    url: url,
    data: xsrf,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

data可不管你要传递,然后只是追加&{{csrf_token}}了这一点。

在您的资源中params:{},尝试csrfmiddlewaretoken:{{csrf_token}}params

编辑:

您可以将数据传递给请求主体

item.$update({csrfmiddlewaretoken:{{csrf_token}}})

和标题为

var csrf = '{{ csrf_token }}'; 
update:{method:'POST', headers: {'X-CSRFToken' : csrf }}

这是一个未记录的问题



 类似资料:
  • 我正在使用curl来测试我的Django表单之一。我尝试过的调用(每个都有错误,为了可读性,多行调用): (1): (在cookie中使用http头和)会导致400错误,并且不会返回任何数据。 (2): (如(1)中所示,但标头属性声明中没有空格,cookie中也有)会导致相同的400错误,并且没有返回任何数据。 (3): (只有带有,没有cookie的http头)导致错误代码403,消息为:未设

  • 我试图创建一个带有动态预填充字段的Django表单:也就是说,当从下拉菜单中选择一个字段()时,其他字段会自动预填充相应的数据。为此,我希望在选择下拉选项后立即向服务器发送POST请求。 到目前为止,我已经尝试了以下模板(以下https://docs.djangoproject.com/en/2.0/ref/csrf/): 但是,当我选择一个下拉选项时,我会得到一个 新:17未捕获的语法错误:意外

  • 我正在使用Amazon SNS在我的HTTP/HTTPSendpoint上接收推送消息。endpoint应用程序是用Django编写的。要在endpoint(web app)上接收通知,HTTP/HTTPSendpoint需要订阅一个主题。 我的问题是当Amzaon SNS发送订阅确认时,它如何在POST请求中发送CSRF令牌,以便我处理请求并检索所需信息? 文档:http://docs.aws.

  • 问题内容: 我不想使用文件,但是只有django才需要发出POST请求。 就像发送请求一样。 问题答案: 结合使用urllib2和urllib中的方法即可解决问题。这是我使用这两种方法发布数据的方式: 是用于打开URL的方法。 将参数转换为百分比编码的字符串。

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我正在使用python的请求模块尝试登录网页。我打开了一个窗口。session(),然后我得到cookie和csrf令牌,它包含在meta标记中。我使用用户名、密码、一个隐藏的输入字段和meta标记中的csrf令牌来构建有效负载。之后,我使用post方法,传递登录url、cookie、负载和头。但在那之后,我无法访问登录页面后面的页面。我做错了什么? 这是我执行登录时的请求标头: 到目前为止,这是