我想知道请求是否实际上是通过http发出的。在我的应用程序中,我有一个看起来像
的测试class Authenticate(APITestCase):
def setUp(self):
self.client = APIClient()
self.password_for_admin = '123456'
self.admin = User.objects.create_superuser(username='myname', email='email@email.com', password='123456')
self.token = Token.objects.create(user=self.admin)
def test_authenticate(self):
""" comment """
self.client.credentials(HTTP_AUTHORIZATION='Basic ' + base64.b64encode('{}:{}'.format(self.admin.username, self.password_for_admin)))
response = self.client.post('/api/authenticate/')
print response
在我看来,我有:
@api_view(('POST',))
def authenticate(request, format=None):
""" comment """
import pprint
log.debug(pprint.pprint(request))
try:
"asdlfjl"
except Exception, e:
response = "An error occurred, {}".format(e)
return Response(response)
我的设置如下:
INSTALLED_APPS = (
...
'django.contrib.sessions',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
...
)
请求在我的日志文件中打印为None。我需要参加会议。我试过request.session(这是None),这就是我引发这个问题的原因。
答案 0 :(得分:1)
我明白了。服务器确实使用testserver域发送请求。这是一个误导性问题,代码错了。用户在到达此视图方法时已使用其余基本后端进行了身份验证。
通过大量研究我发现用户正在通过休息进行身份验证,但是其他后端不会调用login方法。由于不会从休息后端调用登录,因此会话永远不会附加到请求。我将authenticate方法更改为login,我只需通过执行以下操作调用login:
...
@api_view(('POST',))
def login(request, format=None):
try:
from django.contrib.auth import login
if request.user and request.user.is_active:
login(request, request.user)
...
response = ...
else:
response = {}
except Exception, e:
response = "An error occurred, {}".format(e)
return Response(response)