设定:
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中记录这些登录尝试。
答案 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