2015-12-03 4 views
0

Я создал приложение, которое показывает пользователям их использование и квоты на хранение в системе. Поскольку существует много пользователей, просеивание через их распределения памяти может быть утомительным, поэтому я хочу дать администраторам возможность действовать как этот пользователь. Приложение решает, какой пользователь обращается к приложению на основе идентификатора сотрудника, полученного через безопасный badg, переменная (EMPLOYEE_ID) сохраняется в словаре request.META.Занятия Django не работают

В идеале, я хочу, чтобы администраторы могли переопределить идентификатор сотрудника с идентификатором другого пользователя, разместив его в форме. Форма работает, а затем служит на странице storage_home.html в качестве сотрудника, которому администратор хочет действовать как через запрос POST, но когда я или другой администратор нажимает и выполняет GET для квот, словарь request.session пуст!

EMPLOYEE_ID is the original employee id of the admin 
SIM_EMPLOYEE_ID is the employee the admin wishes to act as 

Интересно, если это так, как я ссылки на квоты просмотра в шаблоне storage_home.html? Не уверен.

Вот мой код, я считаю, что вам нужны только представления и шаблон, который вызывает функцию просмотра квот, чтобы узнать, в чем проблема, поскольку словарь request.sessions имеет переменную SIM_EMPLOYEE_ID после сообщения, которое служит storage_home. HTML. Я опустил некоторые переменные из представлений, которые используются в шаблоне, но они работают очень хорошо, не хотелось слишком много загромождать код.

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

SESSION_COOKIE_SECURE = True 
SESSION_COOKIE_DOMAIN = '.mydomain.com' 
SESSION_SAVE_EVERY_REQUEST = True 
SESSION_EXPIRE_AT_BROWSER_CLOSE = False 

views.py

def home(request): 
    """Redirect requests at root url to /storage""" 

    return HttpResponseRedirect('/storage/') 

def storage(request): 
    """Return the home template.""" 

    context = {} 
    context.update(csrf(request)) 

    empid = request.session.get('SIM_EMPLOYEE_ID') 
    if not empid: 
     empid = request.META.get('EMPLOYEE_ID') 

    if functions.is_admin(empid): 
     form = UserForm() 
     context['form'] = form 
     template = loader.get_template('storage_admin.html') 
    else: 
     template = loader.get_template('storage_home.html') 

    data = RequestContext(request, context) 
    return HttpResponse(template.render(data)) 

def sim_user(request): 
    context = {} 
    context.update(csrf(request)) 

    if request.method == 'POST': 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      empid = form.cleaned_data['empid'] 
      request.session['SIM_EMPLOYEE_ID'] = empid 
      request.session.modified = True 
      return storage(request) 

    template = loader.get_template('deny.html') 
    data = RequestContext(request, context) 
    return HttpResponse(template.render(data)) 

def quotas(request, sitename): 
    """Return quota page depending on the 
     id of the employee. If employee is an 
     administrator, show all the quota information 
     for all users/projects. If employee is a user 
     of the sitename, show them user specific quota information. 
     Otherwise, deny access and display a custom template.""" 

    context = {} 
    site = sitename.capitalize() 

    # EMPLOYEE_ID is in the Http Request's META information 
    empid = request.session.get('SIM_EMPLOYEE_ID') 
    if not empid: 
     empid = request.META.get('EMPLOYEE_ID') 

    if not empid: 
     template = loader.get_template('deny.html') 
     return HttpResponse(template.render(RequestContext(request, context))) 

    if functions.is_admin(empid): 
     template = loader.get_template('all_quotas.html') 
    else: 
     template = loader.get_template('personal_quotas.html') 

    data = RequestContext(request, context) 
    return HttpResponse(template.render(data)) 

storage_home.html

{% extends 'base.html' %} 

{% block title %}Storage Utilization{% endblock %} 

{% block content %} 
    <h1 id="header"><b>Storage Utilization</b></h1> 
    <p></p> 
    <table id="storage_table" cellspacing="15"> 
     <tbody> 
     {% for site in sites %} 
     {% url "su.views.quotas" as quota %} 
     <tr> 
      <td><a href="{{ quota }}{{ site }}/"><img src="/static/images/{{ site }}.png"></a></td> 
     </tr> 
     {% endfor %} 
     </tbody> 
    </table> 
    <br></br> 
{% endblock %} 

Спасибо за любую помощь, пожалуйста, дайте мне знать, если вам нужно больше объяснения, кода или упрощения.

ответ

0

Выключает удаление SESSION_COOKIE_SECURE = Истинное исправление проблемы. Это моя ошибка, потому что я не забыл, что в моей среде dev используется http и prod https. У меня на самом деле есть отдельные файлы настроек, но я не смог правильно их использовать, когда вернулся к тестированию этой новой функции. Я считаю, что установка SESSION_COOKIE_SECURE в True при использовании https должна работать, как только я тестирую производственный сервер.

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