客户端访问登录视图,
//user is properly set here
user = auth.authenticate(username=email, password=password)
auth.login(request,user)
请求登录视图的同一个客户端请求另一个视图
// I expect the same user I logged in previously here. But I see anonymous user here.
user = request.user
我不知道 Web 服务器如何准确识别来自同一个用户的两个不同的 http 请求(因为 http 是无连接的)。但我知道这session
是使它成为可能的概念。
我MIDDLEWARE_CLASSES = ('django.contrib.sessions.middleware.SessionMiddleware',...)
在我的settings.py
还有什么我需要检查才能完成这项工作吗?
-编辑
我调试了一下,
django/contrib/auth/ init :login 确实 request.session[SESSION_KEY] = user.id django/contrib/auth/ init :get_user 尝试在下次运行时查找 request.session[SESSION_KEY] 并失败。
我需要了解 request.session 是什么。
我认为请求是客户端根据 http-request 发送的东西。(所以它不是持久的)
**以下是我的理解,如有错误请指正**
- 当用户登录时,服务器为用户分配一个唯一的 id 并将其发送给用户。
- 服务器还将 id 的相关数据存储在某个持久的地方。
- 用户为每个后续的 http 请求发送唯一的 id。(这是 cookie)
- Django 使用给定的 id 查找存储在第 2 步(或在其他情况下)中的数据。
- Django 将数据放入 request.session 并提供给查看。
我怀疑这一切都是由于我从http://www.micahcarrick.com/django-email-authentication.html复制的自定义身份验证后端
我的第一视角。
@csrf_exempt
def login(request):
# import pdb
# pdb.set_trace()
email = request.POST['email']
password = request.POST['password']
user = auth.authenticate(username=email, password=password)
# auth.logout(request)
if user is not None and user.is_active:
auth.login(request, user)
profile = user.get_profile()
user_dict = profile.to_dict()
jsonUser = json.dumps(user_dict, ensure_ascii=False, cls=DjangoJSONEncoder)
return HttpResponse(jsonUser)
else:
raise Http404
我的第二种看法。
@csrf_exempt
def user_update(request):
import pdb
pdb.set_trace()
user = request.user
=> if not user.is_authenticated():
raise Http404 // always ends up here
print 'in user_update'
.......
MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django. contrib.messages.middleware.MessageMiddleware', # 取消注释下一行以获得简单的点击劫持保护:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware', )
我的后端
from django.contrib.auth.models import User, check_password
class EmailAuthBackend(object):
"""
Email Authentication Backend
Allows a user to sign in using an email/password pair rather than
a username/password pair.
"""
supports_inactive_user = False
def authenticate(self, username=None, password=None):
""" Authenticate a user based on email address as the user name. """
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
""" Get a User object from the user_id. """
print 'getting an user for user_id: ', user_id
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None