我制作了一个名为/cars
的端点。
一个人可以创建带前端的汽车,但是设备使用具有API密钥的SDK读取汽车。通过这种方式,2家租车公司可以使用API而不会让汽车混乱。每个应用都有自己的API密钥和自己管理内容的人。
这是使用django restframework 3.x和django-oauth-toolkit实现的。
我正在为人类检索汽车而写一个测试,而另一个用于设备。
这是失败的:
def test_get_list(self):
# devices have a django user (AUTH_USER_MODEL ---onetoone--- Device)
self.client.force_authenticate(user=self.user_device)
self._get_list()
self.client.force_authenticate(user=None)
force_authentication将request.auth设置为None。但是,对于邮递员或httpie,request.auth包含Application对象。
查询集是:
def get_queryset(self):
if hasattr(self.request.user, 'device'):
# get the cars created by the owner of the API Key
return self.request.auth.application.user.cars.all()
return self.request.user.cars.all() # get my cars
答案 0 :(得分:1)
我建议您使用check_object_permission
进行此类检查。您可以阅读更多here。
DRF文档指出,如果您使用APIRequestFactory
,则需要强制验证请求。来自documentation:
from rest_framework.test import force_authenticate
factory = APIRequestFactory()
user = User.objects.get(username='olivia')
view = AccountDetail.as_view()
# Make an authenticated request to the view...
request = factory.get('/accounts/django-superstars/')
force_authenticate(request, user=user)
response = view(request)
要使用APIClient
进行身份验证,请尝试使用credentials
。 documentation的示例:
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient
# Include an appropriate `Authorization:` header on all requests.
token = Token.objects.get(user__username='lauren')
client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
同样是第二个问题。
答案 1 :(得分:1)
正如documentation force_authenticate绕过身份验证所指出的那样,您的工作就是模拟丢失的身份验证部分,包括填写request.auth。
否则,您需要配置数据集并在APIClient实例上调用登录或凭据。