使用 jwt 令牌的 Django API Rest Framework 和 Angular 7 身份验证

Posted

技术标签:

【中文标题】使用 jwt 令牌的 Django API Rest Framework 和 Angular 7 身份验证【英文标题】:Django API Rest Framework and Angular 7 Authentication with jwt token 【发布时间】:2019-04-22 04:02:59 【问题描述】:

我使用 Django Rest Framework 作为后端,使用 Angular 7 作为用户界面。我正在尝试为我的单页应用程序创建一个登录页面并使用 jwt 令牌进行身份验证。我已经管理了后端并且它可以工作。每当我去 /api-token-auth/ 并输入凭据时,我都会在其余框架界面中获得一个令牌。 前端部分虽然困扰着我。我创建了登录组件、授权服务和令牌拦截器。我相信我做了正确的调整,但是每当我尝试从角度登录时,这个错误就会出现在 django 命令提示符中。

“错误请求:/api-token-auth/ [19/Nov/2018 20:16:16]”POST /api-token-auth/ HTTP/1.1" 400 68 Traceback(最近一次调用最后一次): 文件“C:\Python36\lib\wsgiref\handlers.py”,第 138 行,运行中 self.finish_response() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 180 行,finish_response self.write(data) 文件“C:\Python36\lib\wsgiref\handlers.py”,第 274 行,写入 self.send_headers() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 332 行,在 send_headers self.send_preamble() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 255 行,在 send_preamble ('日期: %s\r\n' % format_date_time(time.time())).encode('iso-8859-1') 文件 “C:\Python36\lib\wsgiref\handlers.py”,第 453 行,在 _write 结果 = self.stdout.write(data) 文件“C:\Python36\lib\socketserver.py”,第 775 行,写入 self._sock.sendall(b) ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止 机器 [2018 年 11 月 19 日 20:16:16]“POST /api-token-auth/HTTP/1.1”500 59 ---------------------------------------- 处理来自 ('127.0 的请求时发生异常.0.1', 51566) 回溯(最近 最后调用):文件“C:\Python36\lib\wsgiref\handlers.py”,第 138 行,在 跑步 self.finish_response() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 180 行,finish_response self.write(data) 文件“C:\Python36\lib\wsgiref\handlers.py”,第 274 行,写入 self.send_headers() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 332 行,在 send_headers self.send_preamble() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 255 行,在 send_preamble ('日期: %s\r\n' % format_date_time(time.time())).encode('iso-8859-1') 文件 “C:\Python36\lib\wsgiref\handlers.py”,第 453 行,在 _write 结果 = self.stdout.write(data) 文件“C:\Python36\lib\socketserver.py”,第 775 行,写入 self._sock.sendall(b) ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止 机器

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “C:\Python36\lib\wsgiref\handlers.py”,第 141 行,运行中 self.handle_error() 文件“C:\Python36\lib\site-packages\django\core\servers\basehttp.py”,行 86,在handle_error中 super().handle_error() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 368 行,在 handle_error self.finish_response() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 180 行,finish_response self.write(data) 文件“C:\Python36\lib\wsgiref\handlers.py”,第 274 行,写入 self.send_headers() 文件“C:\Python36\lib\wsgiref\handlers.py”,第 331 行,在 send_headers 如果不是 self.origin_server 或 self.client_is_modern():文件“C:\Python36\lib\wsgiref\handlers.py”,第 344 行,在 client_is_modern return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9' TypeError: 'NoneType' object is not subscriptable

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件 “C:\Python36\lib\socketserver.py”,第 639 行,在 process_request_thread 中 self.finish_request(request, client_address) 文件“C:\Python36\lib\socketserver.py”,第 361 行,在 finish_request self.RequestHandlerClass(request, client_address, self) 文件“C:\Python36\lib\socketserver.py”,第 696 行,在 init self.handle() 文件“C:\Python36\lib\site-packages\django\core\servers\basehttp.py”,行 154,在手柄中 handler.run(self.server.get_app()) 文件“C:\Python36\lib\wsgiref\handlers.py”,第 144 行,运行中 self.close() 文件“C:\Python36\lib\wsgiref\simple_server.py”,第 35 行,关闭 self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split'"

我真的想了解基于此错误发生的情况。有人有想法吗?谢谢

更新

我从未导入过 FormsModul,显然这是导致问题的原因。

【问题讨论】:

【参考方案1】:
line 35, in close self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'

由于某种原因,self.status属性返回None,无法拆分,从而导致错误。

【讨论】:

显然问题出在我的 app.module.ts 中没有导入的 FormsModule。感谢您的回答

以上是关于使用 jwt 令牌的 Django API Rest Framework 和 Angular 7 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

带有 jwt 身份验证的 django rest api 要求 csrf 令牌

使用 jwt 令牌的 Django API Rest Framework 和 Angular 7 身份验证

Django JWT 令牌停用

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

如何在 Django 和 Python 中使用 JWT(JSON Web 令牌)来创建用于注册和登录的 REST API

如何删除 django JWT 令牌?