【问题标题】:Django CSRF token without a browser没有浏览器的 Django CSRF 令牌
【发布时间】:2012-08-01 07:47:45
【问题描述】:

我有一个使用 django 实现的网络应用程序(游戏)。常规的 django 视图与 CSRF 令牌一起工作得很好,但我也想让计算机玩家与服务器交谈。我用的是websockets(django-socketio),所以电脑玩家需要连接SocketIOServer,但是socket.io协议中的第一个请求是post,django响应CSRF验证失败。如何在没有浏览器的情况下获取 CSRF cookie 集? (或者只是绕过电脑玩家的CSRF验证,但这似乎有点不安全。)

我试图用来将电脑播放器连接到服务器的代码如下所示:

def connect(self, host, port):
    conn  = httplib.HTTPConnection(host + ':' + str(port))
    conn.request('POST','/socket.io/1/')
    resp  = conn.getresponse()
    resp_text = resp.read()
    print resp_text
    hskey = resp_text.split(':')[0]
    websocket.enableTrace(True)
    url = 'ws://' + host + ':' + str(port) + '/socket.io/1/'
    ws = websocket.WebSocketApp(url + 'websocket/' + hskey,
            on_message=self.on_message,
            on_close=self.on_close)
    ws.on_open = self.on_open
    try:
        ws.run_forever()
    except KeyboardInterrupt:
        ws.close()

在我发出发布请求之前,我需要获得一个 CSRF 令牌。知道该怎么做吗?

【问题讨论】:

    标签: django websocket socket.io csrf


    【解决方案1】:

    可以通过csrf_exempt装饰器禁用CSRF保护,请查看此示例:

    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    @csrf_exempt
    def my_view(request):
        # you code here
    

    您可以在官方 django 文档中查看更多信息:

    https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#csrf-protection-should-be-disabled-for-just-a-few-views

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 2011-12-11
      • 2021-04-01
      • 2021-04-07
      • 2020-11-09
      • 1970-01-01
      • 2023-03-21
      • 2013-08-11
      相关资源
      最近更新 更多