【问题标题】:limiting data using tasty pie authorization使用美味派授权限制数据
【发布时间】:2015-02-17 06:23:30
【问题描述】:

我正在关注Tutorial on tasty pie implem.的美味馅饼教程
以下是models.py

#models.py

from tastypie.utils.timezone import now
from django.contrib.auth.models import User
from django.db import models
from django.utils.text import slugify


class Entry(models.Model):
    user = models.ForeignKey(User)
    pub_date = models.DateTimeField(default=now)
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    body = models.TextField()

    def __unicode__(self):
        return self.title

    def save(self, *args, **kwargs):
        # For automatic slug generation.
        if not self.slug:
            self.slug = slugify(self.title)[:50]

        return super(Entry, self).save(*args, **kwargs)

这是应用文件夹 blogapp 中的 api.py

from django.contrib.auth.models import User
from tastypie import fields
from tastypie.authorization import Authorization
from tastypie.resources import ModelResource
from blogapp.models import Entry
from tastypie.authentication import BasicAuthentication


class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        excludes = ['email', 'password', 'is_active', 'is_staff', 'is_superuser']
# Add it here.
        authentication = BasicAuthentication()

class EntryResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')

    class Meta:
        queryset = Entry.objects.all()
        resource_name = 'entry'

我成功获得了要求用户名和密码的身份验证浏览器窗口 当我输入这个网址时。

http://x.x.x.x:xxxx/blogapp/api/v1/user/?format=json

身份验证后,它以 json 格式向我显示所有用户的数据

  1. 如何限制 json 数据以仅显示特定于经过身份验证的用户的特定信息。例如,只有“用户”是经过身份验证的“条目”

  2. 一旦通过身份验证如何断开用户连接。重新启动服务器并清除 cookie 不起作用。一旦通过身份验证,我就无法再次进入密码窗口

【问题讨论】:

    标签: python django authentication tastypie


    【解决方案1】:

    对于问题 1:在您的 UserResource 上,您需要覆盖 get_object_list 方法,以便它返回过滤后的查询集,如下所示:

    def get_object_list(self, request):
        return super(UserResource, self).get_object_list(request).filter(username=request.user)
    

    对于问题 2:您需要使用 prepend_urls 手动添加您的登录/注销端点并调用正确的 django 登录/注销函数,如下所示:

    class UserResource(ModelResource):
        class Meta:
            queryset = User.objects.all()
            resource_name = 'user'
            excludes = ['email', 'password', 'is_active', 'is_staff', 'is_superuser']
            authentication = SessionAuthentication()
    
        def get_object_list(self, request):
            return super(UserResource, self).get_object_list(request).filter(username=request.user)
    
        def prepend_urls(self):
            return [
                url(r"^(?P<resource_name>%s)/login%s$" %
                    (self._meta.resource_name, trailing_slash()),
                    self.wrap_view('login_user'), name="api_login"),
                url(r'^(?P<resource_name>%s)/logout%s$' %
                    (self._meta.resource_name, trailing_slash()),
                    self.wrap_view('logout_user'), name='api_logout'),
            ]
    
        def login_user(self, request, **kwargs):
            self.method_check(request, allowed=['post'])
            data = self.deserialize(request, request.body)
            user = authenticate(username=data.get('username'), password=data.get('password'))
            if user:
                login(request, user)
                return self.create_response(request, {'success': True})
            return self.create_response(request, {'success': False})
    
        def logout_user(self, request, **kwargs):
            self.method_check(request, allowed=['post'])
            logout(request)
            return self.create_response(request, {'success': True})
    

    所以基本上是:

    1. 将“固定”网址添加到您的资源中
    2. 将它们链接到您的函数
    3. 从 Django 进行正确的登录/注销
    4. 在您的函数中返回响应

    此资源正确返回并在 cookie 上设置正确的 csfr 和 sessionid。

    顺便说一句,您应该使用 curl 或类似的东西来测试它并进行测试。您无法注销的原因是您没有从 django 执行正确的 logout() 操作。要正确使用 sweetpie,您应该只使用 rest 调用而不是浏览。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2015-11-04
      • 2014-04-18
      • 2012-10-30
      相关资源
      最近更新 更多