Я создал приложение, которое показывает пользователям их использование и квоты на хранение в системе. Поскольку существует много пользователей, просеивание через их распределения памяти может быть утомительным, поэтому я хочу дать администраторам возможность действовать как этот пользователь. Приложение решает, какой пользователь обращается к приложению на основе идентификатора сотрудника, полученного через безопасный 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 %}
Спасибо за любую помощь, пожалуйста, дайте мне знать, если вам нужно больше объяснения, кода или упрощения.