所以我有登录视图,效果很好并返回一个令牌。
@csrf_exempt
def login(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
if username is not None and password is not None:
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
token, created = Token.objects.get_or_create(user=user)
if not created:
created = datetime.datetime.now()
return json_response({
'token': token.token,
'username': user.username
})
else:
return json_response({
'error': 'Invalid User'
}, status=400)
else:
return json_response({
'error': 'Invalid Username/Password'
}, status=400)
else:
return json_response({
'error': 'Invalid Data'
}, status=400)
elif request.method == 'OPTIONS':
return json_response({})
else:
return json_response({
'error': 'Invalid Method'
}, status=405)
卷曲线是:
curl -X POST -d "username=root&password=myPassword" http://localhost:80/api/login/
并且该行的结果很棒:
{"username": "root", "token": "3dfdcd6b2abeb432131c734f82a737505ee3110d"}
通过httprequest登录后,我想向服务器发送GET请求以获取视图。
我的观点示例
from django.contrib.auth.middleware import get_user
def list_orders(request):
# check if authenticated else will exit
if not get_user(request).is_authenticated():
return ResponseError('authentication or permission failure')
...
...
此视图始终返回未经过身份验证的错误:(
我的http请求exmple:
curl http://localhost:80/orders/ -d "csfrmiddletoken=3dfdcd6b2abeb432131c734f82a737505ee3110d"
返回:
{"status": "failed", "details": "authentication or permission failure"}
不使用cookies对我来说非常重要!所以请不要建议在我的卷曲线上添加-b -c params。
如何使用登录视图中的令牌获取请求?
谢谢!
修改 我用2个STRps解决了这个问题: 一个我使用另一个函数来确保我得到一个令牌:
def token_required(func):
def inner(request, *args, **kwargs):
if request.method == 'OPTIONS':
return func(request, *args, **kwargs)
auth_header = request.META.get('HTTP_AUTHORIZATION', None)
if auth_header is not None:
tokens = auth_header.split(' ')
if len(tokens) == 2 and tokens[0] == 'Token':
token = tokens[1]
try:
request.token = Token.objects.get(token=token)
return func(request, *args, **kwargs)
except Token.DoesNotExist:
return json_response({
'error': 'Token not found'
}, status=401)
return json_response({
'error': 'Invalid Header'
}, status=401)
return inner
第二,我改变了我的httprequest:
curl -X GET http://127.0.0.1:80/orders/ -H 'Authorization: Token 3dfdcd6b2abeb432131c734f82a737505ee3110d'
但是现在即使我通过网络界面登录到django并且我尝试访问该链接时出现错误,我没有有效的标题。 如何通过httprequest确保两种方式(Web界面)和令牌能够协同工作?