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)】获得】)方法

代码:

View Code
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 )  

你可能感兴趣的:(Authentication)