Python django websocket redis中的授权
我用的是Django v。1.7.6,django rest框架和。我想通过websocket发送消息。 起初,我尝试发送websocket广播消息,如本文所述 客户端代码: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
#!/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不支持此功能,请验证链接: