如何使用Django-tastypie与django轴

时间:2017-07-19 16:14:19

标签: python django tastypie django-authentication

设定:

django==1.8
django-tastypie==0.13
django-axes==2.3

我通过tastypie获得了登录资源,如下所示

from django.contrib.auth import login


class LoginResource(Resource):
    class Meta:
        resource_name = 'login'
        allowed_methods = ['post']

    def obj_create(self, bundle, **kwargs):
        form = AuthForm(data=bundle.data)
        if form.is_valid():
            request.session.set_expiry(0)
            if form.get_user():
                login(bundle.request, form.get_user())
                raise ImmediateHttpResponse(response=HttpResponse(status=200))
        raise ImmediateHttpResponse(response=http.HttpBadRequest(status=400))

我无法弄清楚如何在django-axes中记录这些登​​录尝试。

2 个答案:

答案 0 :(得分:1)

我自己的解决方案是:我在views.py

中编写自定义登录视图
from django.contrib.auth.views import login


def core_login(request, *args, **kwargs):
    kwargs["authentication_form"] = AuthForm
    return login(request, *args, **kwargs)

在tastypie资源中:

from core.views import core_login

class LoginResource(Resource):
    class Meta:
        resource_name = 'login'
        allowed_methods = ['post']

    def obj_create(self, bundle, **kwargs):
        bundle.request.POST = bundle.data
        if core_login(bundle.request).status_code == 302:
            raise ImmediateHttpResponse(response=HttpResponse(status=200))
        raise ImmediateHttpResponse(response=http.HttpBadRequest(status=400))

答案 1 :(得分:0)

查看at the code from django-axes我们可以看到它使用名为watch_login的装饰器来提供其功能。

要使用您的资源记录登录尝试,您必须将该装饰器应用于当用户尝试使用该给定资源登录时调用的view

根据tastypie代码,您可以覆盖资源的prepend_urls方法并添加您的网址。像这样(这只是一个例子,没有经过测试):

def prepend_urls(self):
    from axes.decorators import watch_login
    urls = [
        url(r"^(?P<resource_name>%s)/login$" % (self._meta.resource_name,), watch_login(self.wrap_view('dispatch_list')), name="login-enpoint")
    ]
    return urls