【发布时间】:2020-04-14 19:20:38
【问题描述】:
我有一个只能通过传递 JWT 令牌访问的 API。我在 Django 中使用 Simple-JWT 库。此外,我已将此令牌存储在我的 localStorage 中,并通过 Ajax 在我的视图模块中获取它。 我使用 GET 方法创建了一个 API,它应该从模型中检索某些数据。但是,当通过 Python 中的 Requests 模块访问 API URL 时,它仍然说没有提供身份验证凭据。请参阅下面的代码:
models.py:
class Mymodel(models.Model):
emp= models.ForeignKey(User, on_delete = models.CASCADE)
entry_time = models.DateTimeField()
views.py:
def get_time(request):
if (request.method == 'GET'):
tk = request.GET.get('token') #from AJAX
headers = {'Authorization': 'JWT {}'.format(tk), 'content-type': "application/json",}
url = 'http://127.0.0.1:8000/secret_api/'
response = requests.get(url, headers = headers)
if response:
print("success")
return HttpResponse(response)
class MyAPI(generics.ListAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, format = None):
user_id = User.objects.get(username=request.GET.get('username')).pk
user = User.objects.get(id = user_id)
if not Mymodel.objects.filter(emp=user).exists():
current_time = timezone.now()
time = Mymodel.objects.create(emp=user, entry_time=current_time)
data = time.entry_time
return data #returns time
AJAX 调用:
$.ajax({
cache: false,
url: {% url 'get_time' %}, #points to the get_time function
type: 'GET',
data: {username: username, token: token},
success: function(data) {
$("#time").html(data);
}
但是,在执行 get_time 函数时,我收到此错误:
{"detail": "Authentication credentials were not provided."}
当我从以下位置更改标题时:
headers = {'Authorization': 'Bearer {}"'.format(tk)}
我收到此错误:
{"detail":"Given token not valid for any token type","code":"token_not_valid","messages":[{"token_class":"AccessToken","token_type":"access","message":"Token is invalid or expired"}]}
我 100% 肯定从 AJAX 传递的令牌是正确的。我哪里错了?
【问题讨论】:
-
你有一个双引号字符被附加到标题
{}",这应该在那里吗? -
不,不是。可能是我在解决问题时打错了,对不起。
-
删除它可以解决问题吗?
-
我现在收到此错误:ValueError:视图 myapp.views.get_time 未返回 HttpResponse 对象。它返回 None 。我应该收到回一个时间。但我什么也没收到。
-
尝试在调用 API 后添加
response.raise_for_status()以查看错误
标签: django django-rest-framework jwt