Django API: 用testypie实现API Key Authentication 和 Piston实现HTTP Authentication
Testypie实现API Key Authentication
1. 建立一个handler的类,继承ModelResource
class apikey_handler(ModelResource)
2. 建立class Meta
3. queryset是返回数据库数据,也就是最终页面返回的值
queryset = Ticket【models里的类,主model】.objects.all()
4. 设置url的路径名称
resource_name = 'user'
和urls.py的设置放一起说,在urls.py中:
from tastypie.api import Api
v1_api = Api(api_name='v1') 设置api目录下的子目录
v1_api.register(apikey_handler()) 将写的handler注册进去
urlpattern里的设置为( r'^父url/', include(v1_api.urls) )
最终访问的url为 “父url/ v1/ user/ ?format=json 【这里是选择输出在页面的格式,默认的有json和xml】
5. 设置验证
authentication = ApiKeyAuthentication()
authorization = DjangoAuthorization()
6. 可选
excludes = ['id'] 过滤不要的
include_resource_uri = False 不显示resource_uri
serializer =CSVSerializer() 定义输出格式
filtering={
"username":ALL, }
7. 生成api key
在models或meta里加入models.signals.post_save.connect(create_api_key, sender=User)
当新建一个用户时会在database里生成一个table教tastypie_apikey,里面会生成用户名和key的值
8. 使用api key
在url链接后加上【&username=用户名&api_key=生成的key】
筛选Database
1. 比如上述的主model Ticket里有个foreign key
如:vuln = models.ForeignKey('Vuln')
我们要在handler新建一个vul_handler。步骤一样,只不过queryset 变成 Vuln.objects.all()
2. 将vul_handler加入主handler中
vuln【与1中,model里的变量名一致!】=fields.ForeignKey('*.*.*.vul_handler【子handler位置】','vuln【与头一致!】', full=True)
class Meta:......
参数传递
重写方法。由于在父url为include,不能传递参数,所以只能在方法内override。
1. def obj_get_list(self, request, **kwargs) 重写这个参数,获取filter,对queryset进行过滤筛选。
2. 制定要传递的参数
scanid=request.GET['scanid'] 【这样的话在url中要加入&scanid=3】
3. 利用这个参数对target进行处理
4.返回修改好的queryset
return queryset
生成&重置key
利用Apikey类里的 ApiKey.objects.create(user=user 【为user_id,所以得用【user = User.objects.get(username=someuser)】获得】)方法
代码:
try: api_key = ApiKey.objects.get(user=user) api_key.key = None api_key.save() return HttpResponse("API Key reset!") except ApiKey.DoesNotExist: api_key = ApiKey.objects.create(user=user) return HttpResponse("API Key created!")
HTTP Authentication
1. 在handler.py中
authentication = BasicAuthentication()
2. 在urls.py中
from piston.authentication import HttpBasicAuthentication
auth = HttpBasicAuthentication(realm="Download report")
authhandler = Resource(handler名字, authentication=auth)
urlpattern里的设置为( r'^父url/', authhandler )