(我尝试了类似问题的解决方案,但它们对我不起作用)。
我正在创建一个简单的基于 Django REST 的 Web 应用程序,用户将在其中注册、创建一些事件、稍后登录并查看事件。
以下是此次活动的观点:
class EventGetCreate(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
def get(self, request):
created_user = request.user
events = Event.objects.filter(creator=created_user)
serializer = EventSummary(events, many=True)
return Response(serializer.data)
其urls.py如下:
from django.urls import path, include
from . import views
app_name = 'event'
urlpatterns = [
...
path('eventviewall/', views.EventGetCreate.as_view()),
]
在 core/urls.py 中,我有这个来获取令牌:
from .views import UserViewSet
from rest_framework.authtoken.views import ObtainAuthToken, obtain_auth_token
app_name = 'core'
router = routers.DefaultRouter()
router.register('users', UserViewSet)
urlpatterns = [
path('auth/', obtain_auth_token),
path('register/', include(router.urls)),
]
使用邮递员,我可以成功登录并获取令牌:将请求发送到http://127.0.0.1:8000/api/auth/并获取以下(示例令牌):
{
"token": "xxyyzz"
}
现在我想做的是在获取请求中发送此令牌,并查看用户创建的事件。 我将请求发送到 http://127.0.0.1:8000/event/eventviewall/,并在授权选项卡 -> 承载令牌中设置上述令牌。
但是,我得到以下回复:
{
"detail": "Authentication credentials were not provided."
}
现在,如果我在上面的视图中设置permission_classes = ()(正如类似问题中的一些答案所建议的那样),我会收到以下错误:
TypeError at /event/eventviewall/
Field 'id' expected a number but got <django.contrib.auth.models.AnonymousUser object at 0x0000018BEF4573A0>.
我发现出现此错误是因为 Django 将 request.user 设置为 AnonymousUser,因为它无法对用户进行身份验证。
我该如何解决这个问题?
问题是这不是 Bearer Token。 您应该提供自己的标头
Authorization
以及值 Token: <token>
。
像 Postman 这样的应用程序没有内置这种类型的授权标头,因此您需要手动添加它。