Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django websocket redis中的授权_Python_Django_Websocket_Authorization - Fatal编程技术网

Python django websocket redis中的授权

Python django websocket redis中的授权,python,django,websocket,authorization,Python,Django,Websocket,Authorization,我用的是Django v。1.7.6,django rest框架和。我想通过websocket发送消息。 起初,我尝试发送websocket广播消息,如本文所述 客户端代码: #!/usr/bin/python import websocket import thread import time import requests def on_message(ws, message): print message def on_error(ws, error): print

我用的是Django v。1.7.6,django rest框架和。我想通过websocket发送消息。 起初,我尝试发送websocket广播消息,如本文所述

客户端代码:

#!/usr/bin/python

import websocket
import thread
import time
import requests

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

def on_open(ws):
    def run(*args):
        for i in range(3):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())

if __name__ == "__main__":  
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://localhost/ws/foobar?subscribe-broadcast&publish-broadcast&echo",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    # ws.on_open = on_open
    ws.run_forever()
服务器代码:

msg = RedisMessage("some message")
RedisPublisher(facility='foobar', broadcast=True).publish_message(msg)
这是工作。 然后我尝试发送websocket消息来授权用户,如手册中所述

在服务器端,我替换一个字符串:

msg = RedisMessage("some msg")
RedisPublisher(facility='foobar', users=[SELF]).publish_message(msg)
但我不知道在客户方面该怎么做

我认为有必要发送带有“csrftoken”键的cookie。我能做到:

r = requests.get("http://localhost/api/authlogin/") 
token_value = r.cookies['csrftoken']
cookie = "csrftoken = " + token_value
ws = websocket.WebSocketApp("ws://localhost/ws/foobar?subscribe-user",
                          on_message = on_message,
                          on_error = on_error,
                          on_close = on_close,
                          cookie = cookie)
但它不起作用。你能帮我吗

添加:
我发现,在连接到websocket期间,我应该向cookies发送“sessionid”。我可以这样得到sessionid:

import requests
payload = dict()
payload['password'] = "12345"
payload['username'] = "admin"
req = requests.post("http://localhost/api/auth-token/", data=payload)   
session_id = req.cookies['sessionid']
在URL.py中:

urlpatterns = [
# ... some urls
url(r'^api/auth-token/?', views.ObtainAuthToken.as_view(), name="auth-token")]
在views.py中:

class ObtainAuthToken(views.APIView):
    throttle_classes = ()
    permission_classes = ()
    authentication_classes = (utils.NoAuth,)
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)

def post(self, request):
    """
    Provide auth token by username and password
    ---
    type:
        - name: token

    request_serializer: rest_framework.authtoken.serializers.AuthTokenSerializer
    responseMessages:
        - code: 400
          message: Bad request
    """
    serializer = AuthTokenSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.validated_data['user']
    token, created = Token.objects.get_or_create(user=user)

    user_logged_in.send(sender=self.__class__, request=request, user=user)
    session_key = request.session._get_or_create_session_key()
    print ("views.py::session_key = ", session_key)

    return Response({'token': token.key})
当我如上所述登录时,在DB表中创建了一个名为django_session的行。 当我使用浏览器登录时,在DB表中创建了一个名为django_session的行。它使用其他URL:

urlpatterns = [
    url(r'^api/auth/?', include('rest_framework.urls', namespace='rest_framework')),]

如果我使用第二个sessionid(通过硬代码),websocket会成功工作,但不能使用第一个sessionid。

django websocket redis不支持此功能,请验证链接: