0

我想创建登录资源,但我不知道怎么做:(

我有我的 UserResource,我认为最好使用 LoginResource 作为登录方法。

    class UserResource(ModelResource):
        foreign_key = ForeignKey(ForeignResource, 'foreign_key', null=True)
        ...
        class Meta:
            queryset = User.objects.all()
            allowed_methods = ['post']
            resource_name = 'user'
            authentication = ApiKeyAuthentication()
            authorization = Authorization()

        def obj_create(self, bundle, **kwargs):
            try:
                bundle = super(UserResource, self).obj_create(bundle, **kwargs)
                bundle.obj.set_password(bundle.data.get('password'))
                bundle.obj.save() 
            except IntegrityError:
                raise BadRequest(_("A user with that username already exists."))
            return bundle

那么我应该如何做 LoginResource 实现,这就是我已经走了多远:)

class LoginResource(ModelResource):
    pass

我希望发送(发布/获取)/v1/login/ 用户名和密码,然后如果登录成功,则返回用户对象,就像我有 GET /v1/user/1/ 一样。

提前致谢!

4

2 回答 2

0

像这样的东西应该可以工作(未经测试):

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        fields = ['first_name', 'last_name', 'email']
        allowed_methods = ['get', 'post']
        resource_name = 'user'

    def override_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/login%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('login'), name="api_login"),
            url(r'^(?P<resource_name>%s)/logout%s$' %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('logout'), name='api_logout'),
        ]

    def login(self, request, **kwargs):
        self.method_check(request, allowed=['post'])

        username = request.POST.get('username', '')
        password = request.POST.get('password', '')

        user = authenticate(username=username, password=password)
        if user:
            if user.is_active:
                login(request, user)
                kwargs = {'pk': user.id, 'api_name': u'v1', 'resource_name': u'user'}
                return self.get_detail(request, **kwargs)
            else:
                return HttpResponse(status=401)
        else:
            return HttpResponse(status=401)

    def logout(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        if request.user and request.user.is_authenticated():
            logout(request)
            return self.create_response(request, { 'success': True })
        else:
            return self.create_response(request, { 'success': False }, HttpUnauthorized)

然后你可以这样做:

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"username" : "me", "password": "l33t"}' http://localhost:8000/api/v1/user/login/

它应该在成功登录时为您提供用户对象。

于 2013-06-29T21:51:25.200 回答
0

你需要在这里做一些事情,

  1. 使用授权类将用户对象限制为与 request.user 相关的对象。
  2. 在资源类上使用 prepend_urls 来附加登录和注销视图

例如:https ://gist.github.com/airtonix/5473873

对于比我更有能力的人来说,其中一些代码可能会非常冒犯,但这绝对是你想要前进的方向。

于 2013-04-27T17:44:39.510 回答