Python 如何将django tastypie与django轴一起使用
设置:Python 如何将django tastypie与django轴一起使用,python,django,tastypie,django-authentication,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_c
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 Axis中记录这些登录尝试。看,我们可以看到它使用了一个名为watch\u login
的装饰器来提供其功能
要使用您的资源记录登录尝试,您必须将该装饰程序应用于用户尝试使用给定资源登录时调用的视图
基于tastype
code,您可以覆盖资源的prepend\u url
方法并添加url。像这样(这只是一个例子,没有经过测试):
def prepend_url(self):
从axes.decorators导入watch\u登录
URL=[
url(r“^(?P%s)/login$”%(self.\u meta.resource\u name),watch\u login(self.wrap\u view('dispatch\u list')),name=“login enpoint”)
]
返回URL
接下来是我自己的解决方案:在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))
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))