首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tastypie登录

Tastypie登录
EN

Stack Overflow用户
提问于 2013-04-27 23:15:03
回答 2查看 540关注 0票数 0

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

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

代码语言:javascript
复制
    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实现,这就是我所取得的进展:)

代码语言:javascript
复制
class LoginResource(ModelResource):
    pass

我的愿望是发送(post/ GET ) /v1/ login / username和password,如果登录成功,则返回user对象,就像我有GET /v1/user/1/一样。

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-04-28 01:44:40

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

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

举个例子:https://gist.github.com/airtonix/5473873

其中一些代码可能会对比我更有能力的人造成可怕的冒犯,但这绝对是你想要的方向。

票数 0
EN

Stack Overflow用户

发布于 2013-06-30 05:51:25

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

代码语言:javascript
复制
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)

然后您可以执行以下操作:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16253703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档