标签: tastypie

tastypie - 在哪里限制可能由PATCH更新的字段?

我有一个工作的GET/tastypie(只读)解决方案.

我已经允许PUT/PATCH请求并成功修补记录.

但是,我想将PATCH功能仅限于适当的模型资源上的某些字段,用于(已经)经过身份验证和授权的用户.我仍然希望用户能够获取(参见)所有字段.

实现这种限制的最佳位置(方法?)在哪里?

文档:https://django-tastypie.readthedocs.org/en/latest/interacting.html? highlight = patch#partially -updating-an-existing-resource- patch

python django patch tastypie

3
推荐指数
1
解决办法
1976
查看次数

在django中过滤:每个用户的最后一个帖子

我有 2 个模型, Author 和 Post ,我如何制作一个过滤器,可以在一行中选择每个作者的最后一篇文章(按 id 字段)?,对我来说不好的方法是:

authors = Author.objects.all()
queryset = []
for author in authors:
    posts = Post.objects.filter(author=author).order_by('-id')
    if loc:
        queryset.append(posts[0])
Run Code Online (Sandbox Code Playgroud)

具体来说,这是过滤我的Tastypie Resource“PostResource”,一个过滤器只能给我每个用户的最后一个帖子,按创建排序

带有okm answer和tastypie自定义过滤器的完整解决方案:

class LocationResource(ModelResource):
    user = fields.ForeignKey(AccountResource,'user' )
    class Meta:
        queryset = Location.objects.all().order_by('-id')
        resource_name = 'location'
        #excludes = ['id',]
        list_allowed_methods = ['post','get']
        authentication = ApiKeyAuthentication()
        authorization= Authorization()
        filtering = {'user': ALL_WITH_RELATIONS}

    def obj_create(self, bundle, **kwargs):
        if bundle.request.method == 'POST':
            return super(LocationResource, self).obj_create(bundle, user=bundle.request.user)

    def apply_authorization_limits(self, request, object_list):
        return object_list.filter(user=request.user)

    def dehydrate(self, bundle):
        return …
Run Code Online (Sandbox Code Playgroud)

django django-models tastypie

3
推荐指数
1
解决办法
888
查看次数

Tastypie:使用UTF-8的JSON标头

我正在使用tastypie返回一个资源,其中一个字段是阿拉伯语,因此需要使用UTF-8和Unicode,这是我假设运行其模式的情况:

"word":{...,"help_text":"Unicode字符串数据.例如:\"Hello World \"",...}

这里是json返回的示例,请注意单词的乱码字段:{"approved":false,"id":12,"resource_uri":"/ api/v1/resource/12 /","word":"اه "}

django tastypie

3
推荐指数
1
解决办法
1850
查看次数

Tastypie请求用户在注销方法上是匿名的

使用tastypie API并为用户资源实现一些功能(遵循此示例代码:如何使用tastypie登录django),我想知道如何存放经过身份验证的用户或如何以正确的方式访问它.在测试登录方法时:

curl -u "user:pw" -H "Content-Type: application/json" -X POST --data '{"username" : "user", "password": "pw"}' http://localhost:8000/api/user/login/?format=json   
Run Code Online (Sandbox Code Playgroud)

一切正常; 但是logout方法将request.user视为匿名用户.如何向正确认证的用户传递注销方法?非常感谢.

来自api.py的片段

class UserResource(ModelResource):
    class Meta:
        queryset = AppUser.objects.all()
        resource_name = 'user'
        fields = ['first_name', 'last_name', 'username', 'email', 'is_staff']
        allowed_methods = ['get', 'post', 'patch']
        always_return_data = True
        authentication = BasicAuthentication()
        authorization = Authorization()

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

    def login(self, request, **kwargs):
        """
        Authenticate a user, …
Run Code Online (Sandbox Code Playgroud)

api django basic-authentication tastypie

3
推荐指数
1
解决办法
753
查看次数

Tastypie反序列化导致{"错误":""}

我正在使用django的tastypie.我有一行代码:

data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json'))
Run Code Online (Sandbox Code Playgroud)

我使用命令行中的代码将帖子请求发送到我的网络服务器:

curl -X post -d "{ 'username' : 'user', 'password' : 'password' }" http://127.0.0.1:8000/api/employee/login/ --header "Content-Type:application/json"
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会导致json响应

{"error": ""}
Run Code Online (Sandbox Code Playgroud)

查看我的服务器日志,我看到:

[15/Feb/2014 20:39:49] "post /api/user/login/ HTTP/1.1" 400 13
Run Code Online (Sandbox Code Playgroud)

在反序列化行之前记录的日志消息将被成功记录,但在反序列化行之后立即记录的日志消息将不会被记录,因此我非常确定反序列化是错误的.有谁知道什么可能是错的,或者我是否应该考虑其他问题?

django rest json tastypie

3
推荐指数
1
解决办法
945
查看次数

django tsstypie.order_by queryset

这是我的models.py

class Picture(models.Model):
    image = models.ImageField(upload_to='uploads/')
    caption = models.CharField(max_length=140, null=True, blank=True)
    uploaded = models.DateField()
    comments = models.ManyToManyField(Comment, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

和我的tastypie的API资源,api.py:

class PictureResource(ModelResource):

    class Meta:
        queryset = Picture.objects.all.order_by('-uploaded')
        resource_name = "photo"
        authorization = Authorization()
        API_LIMIT_PER_PAGE = 24
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望我的API页面按照上传的最新图片顺序排列.

我的错误代码是:

函数对象没有属性'order_by'

通常我不知道该怎么做......

(顺便问一下,API_LIMIT_PER_PAGE = 24这是在正确的地方吗?)

sorting api django sql-order-by tastypie

2
推荐指数
1
解决办法
2529
查看次数

验证/授权对asteapie顶级API模式的访问

我知道如何为美食资源设置身份验证/授权:通过资源Meta类中的设置。但是,我如何验证/授权对顶级架构的访问?

例如,我可以在处对资源进行身份验证/授权/api/v1/resource,但如何在处对模式进行身份验证/授权/api/v1

tastypie

2
推荐指数
1
解决办法
445
查看次数

如何使用Tastypie来包装内部函数

我有一个Django Web应用程序,它允许用户通过HTTP从远程服务器上执行stop/start/install_pkg.Django Web应用程序已经实现了start/stop/install_pkg函数,它们基本上创建了相应的URL并使用params调用HTTP url.

我的目标是在用户执行REST调用时使用相同的内部函数,如下所示:

1. https://api/v1/server/<server_name>/start/?api_key=<api_key>&params=<params>
2. https://api/v1/server/<server_name>/stop/?api_key=<api_key>&params=<params>
3. https://api/v1/server/<server_name>/install_pkg/?api_key=<api_key>&params=<params>
Run Code Online (Sandbox Code Playgroud)

并将JSON响应返回给包含远程服务器响应对象的调用方.

到目前为止,我已经使用Tastypie库来通过REST公开对Django Web应用程序的模型数据的只读访问.

非ORM资源上的Tastypie教程通过重写Tastypie的9种方法展示了如何与非ORM资源进行交互.但鉴于我的知识和理解有限,我不清楚如何在我的案例中使用Tastypie.我在这里错过了什么吗?

编辑:(2012年10月29日)

为了进一步说明 - Django Web应用程序为每个远程服务器提供了ORM条目,但此信息是关于特定远程服务器的静态信息,如(名称,IP,域,...),因为它是在注册时创建的.远程服务器到Django Web应用程序.

从Django Web应用程序到远程服务器的Web服务调用获取远程服务器的最新状态,如(app_state,pkg_installed_list,...),并且此数据不会存储在我的Djnago Web应用程序中的任何位置.它在UI中呈现.

因此,关于远程服务器的Django Web应用程序的GET实质上返回静态信息.

谢谢,

api django rest tastypie

2
推荐指数
1
解决办法
3176
查看次数

django/tastypie上的PendingDeprecationWarning

我正在尝试使用tastypie设置一个非常简单的REST服务示例,但是我得到了PendingDeprecationWarning.

以下是浏览器上显示的错误消息

Request Method: GET
Request URL:    http://127.0.0.1:8000/myapp/api/myapp_resource
Django Version: 1.6.2
Exception Type: PendingDeprecationWarning
Exception Value:    
commit_on_success is deprecated in favor of atomic.
Exception Location: /home/pkaramol/Workspace/django-env/lib/python3.3/site-packages/django/db/transaction.py in commit_on_success, line 448
Python Executable:  /home/pkaramol/Workspace/django-env/bin/python3
Python Version: 3.3.2
Python Path:    
['/home/pkaramol/Workspace/django-env/restserver',
 '/home/pkaramol/Workspace/django-env/lib/python3.3',
 '/home/pkaramol/Workspace/django-env/lib/python3.3/plat-x86_64-linux-gnu',
 '/home/pkaramol/Workspace/django-env/lib/python3.3/lib-dynload',
 '/usr/lib/python3.3',
 '/usr/lib/python3.3/plat-x86_64-linux-gnu',
 '/home/pkaramol/Workspace/django-env/lib/python3.3/site-packages']
Run Code Online (Sandbox Code Playgroud)

我正在使用tastypie 0.11.0

没有太多关于此错误的文档或其他报告(警告而是),因此我想询问有关如何进行此操作的建议.

django python-3.x tastypie

2
推荐指数
1
解决办法
984
查看次数

Tastypie,Django,MySQL权限被拒绝错误

我已经设置了一个简单的Web服务,python3 manage.py runserver但仅使用它就可以正常工作,但是当我使用mod_wsgi将应用程序部署到Apache时,会出现以下错误:

(2003, "Can't connect to MySQL server on 'localhost' ([Errno 13] Permission denied)")
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用服务器的名称,然后使用服务器的ip,它只是替换错误消息中的localhost。

这是导航到页面时的XML副本:http : //pastebin.com/QtRzi0X6

编辑:

另外我想补充一点,我正在Fedora 20,Python3,Django 1.6和MariaDB上运行,另外我还在Django和python 3上使用了PyMySQL,因此它可以连接到MySQL

mysql django tastypie

2
推荐指数
1
解决办法
460
查看次数