2015-01-27 2 views
0

Я пытаюсь понять обработку запроса Django.поток запросов Django

Моя цель - перенаправить пользователя сразу после его входа в систему, но когда я запустил этот код, я вижу, что моя база данных не была заполнена записью, которую я хочу, и при перенаправлении выбрано исключение DoesNotExist.

При замене HttpResponseRedirect() с кодом HttpResponse() действует тот же код.

Либо мне не хватает части кода, либо Django рассматривает возможность перенаправления части более раннего запроса и выполнения перенаправления, но не обновления.

Неужели кто-нибудь сталкивался с этим вопросом раньше? версия

Джанго - 1,4

Регистрация вид (не обновление базы данных) -

try: 
    email_id = request.GET.__getitem__('email_id') 
    name = request.GET.__getitem__('name') 
    try: 
     Person.objects.create(email_id=email_id, name=name) 
     request.session['email_id'] = email_id 
     return HttpResponseRedirect('/myaccount/') 
    except IntegrityError: 
     return render_to_response('signup.html') 
except MultiValueDictKeyError: 
    return render_to_response('signup.html') 

Регистрация вид (обновление базы данных правильно) -

try: 
    email_id = request.GET.__getitem__('email_id') 
    name = request.GET.__getitem__('name') 
    try: 
     Person.objects.create(email_id=email_id, name=name) 
     request.session['email_id'] = email_id 
     return HttpResponse('This Works!!') 
    except IntegrityError: 
     return render_to_response('signup.html') 
except MultiValueDictKeyError: 
    return render_to_response('signup.html') 

MyAccount состязаться ж -

# Custom function that decodes the email_id from the session 
email_id = return_email_id(request) 
user = Person.objects.get(email_id=email_id) 
name = user.name 
return render_to_response('myaccount.html', {'name': name}) 

EDIT:

Код для return_email_id():

def return_email_id(request): 
    try: 
     check_session(request) 
     session_cookie = request.COOKIES['sessionid'] 
     session_object = Session.objects.get(pk=session_cookie) 
     get_email_id = session_object.get_decoded()['email_id'] 
     return HttpResponse(get_email_id) 
    except PermissionDenied: 
     raise PermissionDenied() 

    def check_session(request): 
     if request.session.get('email_id'): 
      return True 
     else: 
      raise PermissionDenied() 
+1

Помимо всего прочего, прекратите использовать методы с двойным подчеркиванием, такие как '__getitem__'. Практически никогда нет веских оснований для этого, и, конечно же, не один из кода, который вы опубликовали. GET - это объект типа dict, поэтому используйте метод 'get()'. –

+0

И проблема, похоже, связана с вашей функцией 'return_email_id', возможно, вам стоит опубликовать код для этого. –

+0

@ DanielRoseman - Спасибо. Я буду использовать '__getitem__' для использования' get() '. –

ответ

0

Вы, кажется, решили делать вещи трудный путь.

Ваша функция return_email_id делает много ненужной работы. Сеанс доступен непосредственно в request.session, поэтому нет смысла получать cookie, запрашивать хранилище сеансов, декодировать его и т. Д.

Фактическая проблема, вероятно, в том, что вы возвращаете HttpResponse от этой функции, тогда как представление фактически ожидая электронной почты, которую он может использовать для запроса модели Person. Но я хотел бы избавиться от всей функции, и просто сделать простейшую вещь в представлении:

email_id = request.session.get('email_id') 
if email_id: 
    user = Person.objects.get(email_id=email_id) 
    name = user.name 
    return render_to_response('myaccount.html', {'name': name}) 
else: 
    # return something else if email doesn't exist 

(хотя вы, вероятно, следует также иметь дело со случаем, что вызов Person вызывает исключение DoesNotExist, потому что нет соответствия электронная почта в db).

+0

Я полностью пропустил, что я вернул HttpResponse для тестирования и забыл его удалить. Также истинная цель иметь декодирование состоит в том, чтобы получить идентификатор электронной почты для сеансового пользователя при создании запроса БД (идентификатор электронной почты является первичным ключом).В отдельном примечании, имеет ли смысл установить cookie с идентификатором клиента и использовать его для обработки запросов БД? Возможно, у меня плохой дизайн БД. Большое спасибо за помощь. –

+1

Да, но я хочу сказать, что вы не должны запрашивать SessionStore напрямую, вы должны получить его из 'request.session', который является поддерживаемым API. И нет, это именно то, для чего предназначен сеанс, поэтому вы не должны использовать отдельный файл cookie. –

+0

Отлично. Я вижу, что я делаю сейчас. У меня сложилось впечатление, что у 'request.session' были все значения всех сеансов. Вы были очень полезны - большое спасибо. –

Смежные вопросы