2011-07-23 65 views
25

当我使用以下Python代码向我的Django网站发送POST请求时我得到403:Forbidden错误。Django在发送POST请求时返回403错误

url = 'http://www.sub.domain.com/' 
values = { 'var': 'test' } 

try: 
    data = urllib.urlencode(values, doseq=True) 
    req = urllib2.Request(url, data) 
    response = urllib2.urlopen(req) 
    the_page = response.read() 
except: 
    the_page = sys.exc_info() 
    raise 

当我打开任何其他网站时,它工作正常。 domain.com也是Django网站,它也可以正常工作。 我想,这是Django的配置问题,谁能告诉我该怎么做才能提供对我的脚本的访问?

+0

你能从普通网络浏览器访问网页吗? –

+0

我可以从普通浏览器中获得。我的服务器日志是空的,我没有足够的pijet在我的主机上查看它们。 – Djent

+0

http://stackoverflow.com/a/30210391/940098 – Wtower

回答

22

您发布的视图上是否有Django表单?如果是这样,我不知道它是否给出了csrf错误。我认为这体现为403.在这种情况下,您需要添加{{csrf_token}}标签。只是一个想法。

+0

我在哪里添加该标签?如果在模板中 - 它不起作用。这是我的看法:http://dpaste.com/575405/,t.html只是{{form}} – Djent

+2

你能否更新原始问题以包含你的代码(视图,网址,表单)和html,而不是链接到dpaste? –

+0

@Djent为什么t.html只有一个{{form}}被包含到其他页面中?如果你只是放{{form}},它不是一个有效的网页,甚至没有有效的形式,因为{{form}}只是放置表单元素,你仍然需要添加表单标签。 –

41

看这里https://docs.djangoproject.com/en/dev/ref/csrf/#how-to-use-it

尝试用@csrf_exempt标记您的视图。这样,Django的CSRF中间件将忽略CSRF保护。您还需要使用from django.views.decorators.csrf import csrf_exempt。请参阅:https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

请注意,通过在视图上禁用CSRF保护,您将为CSRF攻击打开大门。

如果安全对您至关重要,请考虑使用@csrf_exempt,然后再使用@requires_csrf_token(请参阅:https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view-needs-the-csrf-token)。然后,在你的脚本中传递这个令牌,就是这样。

+0

非常感谢您分享上述两个链接。我的代码是从django.views.decorators.csrf进口csrf_protect 添加此import语句 后,使免除这样 @csrf_exempt 再次感谢很多特异功能后,运行完全正常。 –

2

响应是403,因为django在每个POST请求中都需要一个csrf标记(包含在发布数据中)。

有各种不同的方式来做到这一点,如:

获取从饼干和方法的标记已经在文章中说明在这里输入链接的描述

您可以从DOM访问使用{{csrf_token}},模板提供

所以现在使用第二种方法:

var post_data = { 
    ... 
    'csrfmiddlewaretoken':"{{ csrf_token }}" 
    ... 
} 

$.ajax({ 
    url:'url', 
    type:'POST' 
    data:post_data, 
    success:function(data){ 
    console.log(data); 
    }, 
    error:function(error){ 
    console.log(error); 
    } 
}); 
0

或者您可以允许发出此帖子请求的权限。

注意:应在您不需要认证用户在我们的服务器上发布任何内容的情况下使用的情况下使用,例如,当新用户首次注册时。

from rest_framework.permissions import AllowAny 

class CreateUser(APIView): 
    permission_classes = (AllowAny,) 
    def post(self, request, format=None): 
     return(Response("hi")) 

另外需要注意的是,如果你想使该职位的要求形成不同的域(在情况下,当应用程序的前面是反应或角和后端是在Django),确保添加以下在设置文件中:

  1. 更新INSTALLED_APPS使用 'coreHeaders':

    INSTALLED_APPS = [
    'corsheaders',
    ]

  2. 白名单中加入以下内容设置您的前端域再次文件:

    CORS_ORIGIN_WHITELIST =( 的 'localhost:8080', )

0

当验证令牌过期或没有令牌与请求一起发送时,我得到此错误。使用更新的令牌解决了问题。

curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/ 

curl -X POST -H "Authorization: JWT mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/ 

取决于令牌类型。