我有一个工作的GET/tastypie(只读)解决方案.
我已经允许PUT/PATCH请求并成功修补记录.
但是,我想将PATCH功能仅限于适当的模型资源上的某些字段,用于(已经)经过身份验证和授权的用户.我仍然希望用户能够获取(参见)所有字段.
实现这种限制的最佳位置(方法?)在哪里?
文档:https://django-tastypie.readthedocs.org/en/latest/interacting.html? highlight = patch#partially -updating-an-existing-resource- patch
我有 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”,一个过滤器只能给我每个用户的最后一个帖子,按创建排序
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) 我正在使用tastypie返回一个资源,其中一个字段是阿拉伯语,因此需要使用UTF-8和Unicode,这是我假设运行其模式的情况:
"word":{...,"help_text":"Unicode字符串数据.例如:\"Hello World \"",...}
这里是json返回的示例,请注意单词的乱码字段:{"approved":false,"id":12,"resource_uri":"/ api/v1/resource/12 /","word":"اه "}
使用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) 我正在使用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)
在反序列化行之前记录的日志消息将被成功记录,但在反序列化行之后立即记录的日志消息将不会被记录,因此我非常确定反序列化是错误的.有谁知道什么可能是错的,或者我是否应该考虑其他问题?
这是我的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这是在正确的地方吗?)
我知道如何为美食资源设置身份验证/授权:通过资源Meta类中的设置。但是,我如何验证/授权对顶级架构的访问?
例如,我可以在处对资源进行身份验证/授权/api/v1/resource,但如何在处对模式进行身份验证/授权/api/v1?
我有一个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>¶ms=<params>
2. https://api/v1/server/<server_name>/stop/?api_key=<api_key>¶ms=<params>
3. https://api/v1/server/<server_name>/install_pkg/?api_key=<api_key>¶ms=<params>
Run Code Online (Sandbox Code Playgroud)
并将JSON响应返回给包含远程服务器响应对象的调用方.
到目前为止,我已经使用Tastypie库来通过REST公开对Django Web应用程序的模型数据的只读访问.
非ORM资源上的Tastypie教程通过重写Tastypie的9种方法展示了如何与非ORM资源进行交互.但鉴于我的知识和理解有限,我不清楚如何在我的案例中使用Tastypie.我在这里错过了什么吗?
为了进一步说明 - Django Web应用程序为每个远程服务器提供了ORM条目,但此信息是关于特定远程服务器的静态信息,如(名称,IP,域,...),因为它是在注册时创建的.远程服务器到Django Web应用程序.
从Django Web应用程序到远程服务器的Web服务调用获取远程服务器的最新状态,如(app_state,pkg_installed_list,...),并且此数据不会存储在我的Djnago Web应用程序中的任何位置.它在UI中呈现.
因此,关于远程服务器的Django Web应用程序的GET实质上返回静态信息.
谢谢,
我正在尝试使用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
没有太多关于此错误的文档或其他报告(警告而是),因此我想询问有关如何进行此操作的建议.
我已经设置了一个简单的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