测试接口设计
前面已经讲了登录的验证机制,需要在headers中加上{ ‘Authorization’: 'Bearer ’ + jwt }才能访问。但是普通的django视图方法不会走JWT的验证机制,新建serializers.py,对模型进行序列化:
from rest_framework import serializers
from users.models import Roles, Users
class RolesSerializer(serializers.ModelSerializer):
class Meta:
model = Roles
fields = '__all__' # 可操作字段, __all__ 表示所有字段
# 在ModelSerializer中可重写对模型操作的方法
class UsersSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
def create(self, validated_data): # 重写创建users模型的方法,对密码进行加密
validated_data['password'] = make_password(validated_data['password'], None, 'pbkdf2_sha256')
return Users.objects.create(**validated_data)
def update(self, instance, validated_data): # 更新
instance.password = make_password(validated_data.get('password', instance.password), None, 'pbkdf2_sha256')
instance.save()
return instance
users中views.py:
from rest_framework.decorators import api_view
from django.http import JsonResponse
from users.models import Roles
from users.serializers import RolesSerializer
# 测试接口 使用api_view装饰器,GET方法访问
@api_view(['GET'])
def roles(request):
"""
:param request: 请求对象
:return: 角色数据
"""
role = Roles.objects.all()
serializer = RolesSerializer(role, many=True)
return Response(serializer.data)
新建对应的url路由:
from users import views
urlpatterns = [
url(r'^roles', views.roles, name="roles"), # 测试
]
访问地址 http://127.0.0.1:8000/roles 如下图:
代码测试
上面是restframework界面显示的,下面我们使用requests模拟访问:
import requests
import json
def login():
data = {
'username': 'xjm',
'password': 'weiqiwater'
}
resp = requests.post("http://127.0.0.1:8000/userController/login/", data=data)
token = json.loads(resp.text)
return token
def roles(token):
headers = {
'Authorization': 'Bearer %s' % token
}
resp = requests.get("http://127.0.0.1:8000/roles/", headers=headers)
response = json.loads(resp.text)
return response
if __name__ == '__main__':
resp = login()
print(resp)
print(roles(resp['data']['jwt']))
第一步:登录用户,获取到服务器返回用户的jwt,
第二步:访问之前写的测试接口,地址 http://127.0.0.1:8000/roles:
获取正确的jwt,测试如下:
随便输入一个jwt,测试如下:
if __name__ == '__main__':
print(roles('123'))