Есть вьюха для аутентификации, которая возвращает токен по логину и паролю
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)
return Response({'token': token.key})
Если сделать запрос на авторизацию, то в куки увидим sessionid и в БД в таблице django_session добавляется запись. Его можно отправить далее при подключении по вебсокету. Но сообщения не приходят.
#!/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__":
payload = dict()
payload['password'] = "12345"
payload['username'] = "admin"
print("payload =", payload)
post = requests.post("http://localhost/api/auth-token/", data=payload)
print('POST::Status code=' + str(post.status_code) + ', reason = ' + post.reason)
print("POST::cookies =", post.cookies)
session_id = post.cookies['sessionid']
cookie = "sessionid = " + session_id
websocket.enableTrace(True)
ws = websocket.WebSocketApp("ws://localhost/ws/any?subscribe-user",
on_message = on_message,
on_error = on_error,
on_close = on_close,
cookie = cookie)
ws.run_forever()
Зато если я авторизуюсь через браузер (правда уже другая авторизация), то в куки я не получаю sesionid, но в БД в таблицу django_session тоже добавляется запись. И если я захардкожу этот sessionid при подключении к вебсокету, то все работает, сообщения доходят как надо.
Ниже две записи из таблицы django_session. Первая запись создалась при авторизации используя python и requests. Вторая при авторизации через браузер. У них всегда такая разница в session_data.
Если я при подключении к вебсокетам передаю sessionid из первой записи - сообщения не приходят, а если из второй - то приходят.
session_key | session_data | expire_date
o74km8c0yaff7h9663f3gtub0n4akd3s |
ZmRiZjIwYWJkOTc3OThkYmM5YzY2OTc1MWQzN2VmY2Q2MDFjNDAzZDp7IndzNHJlZGlzOm1lbWJlcm9mIjpbXX0= |
2015-12-28 12:50:01.248271+03
ji95nne2wgam8m3a7p19gy6ikoyy0xoj |
MjM2NDA2NTJmOGM0ZDliYjE0NzMwNjNlMGNlYTRkYTRjNjM4ODliMTp7Il9hdXRoX3VzZXJfaGFzaCI6IjJjNTIzODI2MWI5NzFiMzVlY2I4MGNhNWQ4MTFhMWQ3NDYzNThhNjQiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCIsIl9hdXRoX3VzZXJfaWQiOjEsIndzNHJlZGlzOm1lbWJlcm9mIjpbXX0= |
2015-12-28 12:50:17.603+03
Помогите пожалуйста разобраться.
Всех с наступающим ;)
Обновлено 29 Дек. 2015, 13:13 AnDrOiD73.