我有一个在Django中使用自定义身份验证的站点,该站点使用用户名,密码和域对Web服务进行身份验证。我需要为每个后续视图的请求对象存储此信息。
直到我尝试进行jquery $ .ajax调用,调试从ajax请求调用的视图我没有会话信息且用户是AnonymousUser,所有似乎都进展顺利。
我需要会话变量来对Web服务进行后续调用以显示数据。我在那里尝试了一些东西,但似乎没有任何工作正常。我想确保用户在能够提交这些Web服务查询之前已登录,因为我希望保持用户名/域在视图中查找密码(而不是在客户端),并确保用户始终登录。
views.py
def login(request):
if settings.DEBUG == True:
print "views.login:Attempting loging at views.login(request)"
if request.method == 'POST':
if settings.DEBUG:
print "views.login: method is POST"
form = LoginForm(request.POST)
if form.is_valid():
if settings.DEBUG:
print "Form is valid, attepmting to authenticate"
Login(request, form.get_user())
str = reverse('cm_base.views.index')
request.session['username']=form.get_user()
request.session['domain']=form.get_domain()
return render_to_response('cm_base/index.html',
{"DEBUG": True,
"user":request.session.get('username'),
'tabs': settings.TAB_LIST},
context_instance=RequestContext(request))
else:
# Their password / email combination must have been incorrect
pass
else:
form = LoginForm()
return render_to_response('cm_base/login.html',
{"DEBUG": True,
'form' : form
},
context_instance=RequestContext(request))
@login_required()
def index(request):
if request.method == 'POST':
print "POSTING"
if settings.DEBUG == True:
print "views.index:Opening index"
return render_to_response('cm_base/index.html',
{"DEBUG": True,
"user":"user",
'tabs': settings.TAB_LIST},
context_instance=RequestContext(request))
@login_required()
def scorecard(request):
user = CustomUser.objects.get(username=request.session.get('username'),
domain=request.session.get('domain'))
使用DoesNotExist *在上面的行上失败:CustomUser匹配查询不存在。查找参数为{'username':无,'domain':无}
base.js
$.ajax({
url : path,
data: $(this).serialize(),
headers: {'X-CSRFToken':getCookie('csrftoken')
,'sessionid':getCookie('sessionid')
},
success : function(data) {
console.log($(this));
//refresh right div
$('#contentpane').empty();
$('#contentpane').html(data.rhtml);
console.log(data.rhtml);
}
});
答案 0 :(得分:1)
看起来我的后端实现就是问题。
backends.py
class CustomBackend(object)
...
def get_user(self, username):
try:
return CustomUser.objects.get(username=username)
except CustomUser.DoesNotExist:
return None
这是在会话传递期间调用的,实际上使用的主键是userid,而不是用户名,所以这总是不返回任何用户并默认为匿名用户。我误解了documentation说用户标识可以是任何内容,包括用户名,我以为我可以这样传递,但我同时拥有自动生成的用户ID和用户名。