Всем привет.
Логика:
1) Пишет анонимный юзер
2) Ему на лету создается аккаунт, который проходит аутентификацию и логин.
3) Автоматически создается пост от его имени.
4) Происходит цикл обновления чата через ajax - выводится его диалог.
Если в чат пишет авторизированный ранее юзер, то все идет без проблем, а если аноним, то на 4 шаге идет CSRF ошибка. Причем если сверять, то CSRF токен на всех шагах один и тот же. Код подрезал немного, чтобы не создавать кучу из внутренних условий вывода
Код создания анонимного юзера и поста от его имени:
def chatpost(request):
token = {}
token.update(csrf(request))
if request.user.is_authenticated():
....
if request.user.is_anonymous():
username = randonname
password = randompass
email = randomemail
user = User.objects.create_user(username=username, password=password, email=email)
user = auth.authenticate(username=username, password=password)
auth.login(request, user)
current_user = request.user
if request.POST:
chat_obj = Chat2Model(topic=topic, author=current_user, chattext=chattext)
chat_obj.save()
json = {}
return JsonResponse(json, safe=False, )
Код Ajax:
<script async>
$('#form_chat').submit(function (e) {
e.preventDefault();
var m_chatcom ...
var m_topic ...
$.ajax({
type: "POST",
url: '/chat/post',
data: {
"chatcom": m_chatcom,
"csrfmiddlewaretoken" : "{{ csrf_token }}",
"topic": m_topic,
},
success: function (data) {
if (data) {
}
else {
}
}
});
});
</script>
(если ручками рефрешнуть страницу, то и юзер отображается, как авторизованный, и сообщения появляется - т.е. этот код отрабатывает правильно).
Код обновления - вывода чата:
def chatupdate(request):
if request.POST:
... логика выбора нужные чатов, csrf токен и user никак не затрагиваются
json = {
"pickup_handler": pickup_handler,
"break_handler": break_handler,
"last_chat_pickup": last_chat_pickup,
"last_chat_break": last_chat_break,
}
return JsonResponse(json, safe=False)
<script type="text/javascript">
function chat(){
.... - взятие переменных id
$.ajax({
type: "POST",
url: '/chat/update',
data: {
"csrfmiddlewaretoken" : "{{ csrf_token }}",
"m_break": m_break,
"m_pickup": m_pickup,
},
success: function (data) {
if (data) {
$('#new_chat_break').append(data.break_handler);
$('#new_chat_pickup').append(data.pickup_handler);
var pstr = data.pickup_handler;
var bsrt = data.break_handler;
}
else {
}
}
});
}
setInterval('chat()', 10000);
</script>