我构建了一个应用程序,向用户显示系统上的存储使用情况和配额。由于有很多用户,筛选他们的存储分配可能很乏味,所以我想让管理员选择充当该用户。应用程序根据通过安全badg接收的员工ID决定哪个用户正在访问应用程序,变量(EMPLOYEE_ID)存储在request.META字典中。
理想情况下,我希望管理员能够通过在表单中发布其他用户的ID来覆盖此员工ID。表单工作,然后作为管理员希望通过POST请求执行的员工提供storage_home.html页面,但是当我或其他管理员点击并为配额执行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字典在为storage_home.html提供服务的帖子后面有SIM_EMPLOYEE_ID变量。我已经从模板中使用的视图中省略了一些变量,但是它们工作得很好,不想让代码混乱太多。
提交表单时会调用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 :(得分:0)
结果删除SESSION_COOKIE_SECURE = True解决了问题。这是我的错,因为我忘了我的开发环境使用http和prod https。我实际上有单独的设置文件,但在我回去测试这个新功能时未能正确使用它们。我相信在测试生产服务器时,使用https时将SESSION_COOKIE_SECURE设置为True。