我一直在尝试使用Django-REST认证来验证桌面应用程序中给出的用户名/密码。
在服务器端,我已经安装了以下DJANGO-REST-FRAMEWORK-JWT包:
https://github.com/GetBlimp/django-rest-framework-jwt
我已经遍历了这个示例,当我在命令行上运行以下命令时,得到一个令牌作为响应:
curl -X POST -d "username=luca&password=letmein123" http://localhost:8000/api-token-auth/
得到:
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InBhbmthaiIsInVzZXJfaWQiOjIsImVtYWlsIjoiIiwiZXhwIjoxNDc5MTE5NzQ2fQ.RA085m-YSnGFheykCCxSVxI_9rW9AC9kEaOkUB5Gm0A"}
我试过这样做:
import requests
resp = requests.post('http://127.0.0.1:8000/api-token-auth/', data={}, auth=('luca', 'letmein123'))
然而,这总是返回响应码400
和Bad request
我的问题是如何从我的桌面python应用程序中做到这一点。我基本上想用用户名和密码调用相同的API,并能够处理响应和访问受保护的API。
请求的auth
参数。request默认用于基本/摘要/自定义HTTP认证,类似于curl的-u, --user <user:password>
参数。您可以定义自己的自定义Authentication类来实现所需的结果,但是实现与原始curl请求相同的结果的基本方法是:
resp = requests.post(
'http://localhost:8000/api-token-auth/',
data={"username": "luca", "password": "letmein123"})
如果你愿意,data
字典也可以通过使用json
参数作为json提供(请求会有所不同,但Django REST框架JWT也支持)。
然后可以使用令牌(用token = resp.json()['token']
提取)访问受限制的url,如下所示:
requests.post(
'http://localhost:8000/some-personal-function/',
json={"foo": 42},
headers={'Authorization': 'JWT ' + token})
顺便说一下,查看response.text
可能有助于找到原因,在您的400
响应的情况下,这将包含以下内容:
'{"username":["该字段是必需的。", password:["必填字段。"]} '