我的API在出错时返回JSON对象,但状态代码为HTTP 200
:
response = JsonResponse({'status': 'false', 'message': message})
return response
Run Code Online (Sandbox Code Playgroud)
如何更改响应代码以指示错误?
我需要为iOS应用程序创建一个Python REST/JSON Web服务来进行交互.网络上没有前端.
什么是最快,最轻量级的框架用于此?学习曲线的实施还考虑了吗?
从研究中我已经完成了Django-Tastypie或Djanjo-Piston看起来最好的选择,Tastypie获胜因为代码库正在积极维护?
我有一个基本的Django模型,如:
class Business(models.Model):
name = models.CharField(max_length=200, unique=True)
email = models.EmailField()
phone = models.CharField(max_length=40, blank=True, null=True)
description = models.TextField(max_length=500)
Run Code Online (Sandbox Code Playgroud)
我需要在上面的模型上执行一个复杂的查询,如:
qset = (
Q(name__icontains=query) |
Q(description__icontains=query) |
Q(email__icontains=query)
)
results = Business.objects.filter(qset).distinct()
Run Code Online (Sandbox Code Playgroud)
我尝试了以下使用tastypie没有运气:
def build_filters(self, filters=None):
if filters is None:
filters = {}
orm_filters = super(BusinessResource, self).build_filters(filters)
if('query' in filters):
query = filters['query']
print query
qset = (
Q(name__icontains=query) |
Q(description__icontains=query) |
Q(email__icontains=query)
)
results = Business.objects.filter(qset).distinct()
orm_filters = {'query__icontains': results}
return orm_filters
Run Code Online (Sandbox Code Playgroud)
在课程Meta for tastypie我有过滤设置为:
filtering = { …
Run Code Online (Sandbox Code Playgroud) 我有一个Django模型的属性,我想通过TastyPie ModelResource公开.
我的模型是
class UserProfile(models.Model):
_genderChoices = ((u"M", u"Male"), (u"F", u"Female"))
user = Models.OneToOneField(User, editable=False)
gender = models.CharField(max_length=2, choices = _genderChoices)
def _get_full_name(self):
return "%s %s" % (self.user.first_name, self.user.last_name)
fullName = property(_get_full_name)
Run Code Online (Sandbox Code Playgroud)
我的ModelResource是
class UserProfileResource(ModelResource):
class Meta:
queryset = models.UserProfile.objects.all()
authorization = DjangoAuthorization()
fields = ['gender', 'fullName']
Run Code Online (Sandbox Code Playgroud)
然而,我目前摆脱tastypie api的是:
{
gender: 'female',
resource_uri: "/api/v1/userprofile/55/"
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用ModelResource中的fields属性,但这没有帮助.很想知道这里发生了什么.
我认为对象创建函数返回新创建的对象是标准.
所以,任何想法你如何在tastypie做到这一点?当我发送POST请求时,创建了对象,但我没有得到任何响应.我想要的是接收新创建的对象(或至少PK)的JSON形式.
我尝试重写该dehydrate
方法,但它似乎甚至没有调用POST.
有任何想法吗?
当我尝试使用AJAX和Tastypie执行HTTP请求时,在为Tastypie资源使用ApiKeyAuthentication时出现以下错误:
XMLHttpRequest cannot load http://domain.com/api/v1/item/?format=json&username=popo&api_key=b83d21e2f8bd4952a53d0ce12a2314c0ffa031b1. Request header field Authorization is not allowed by Access-Control-Allow-Headers.
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何想法?
以下是Chrome的请求标头:
Request Headersview source
Accept:*/*
Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:
origin, authorization, access-control-allow-origin, accept, access-control-allow-headers
Access-Control-Request-Method:
GET
Run Code Online (Sandbox Code Playgroud)
以下是Chrome的响应标头:
Response Headersview source
Access-Control-Allow-Headers:
Origin,Content-Type,Accept,Authorization
Access-Control-Allow-Methods:
POST,GET,OPTIONS,PUT,DELETE
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Length:0
Content-Type:
text/html; charset=utf-8
Date:Fri, 11 May 2012 21:38:35 GMT
Server:nginx
Run Code Online (Sandbox Code Playgroud)
如您所见,它们都有用于授权的标头,但授权不起作用.
这是我用来编辑响应头的django中间件:https: //gist.github.com/1164697
编辑:我发现了问题.我试图连接到www.domain.com,它只接受domain.com
当我尝试在ModelResource中使用authentication = ApiKeyAuthentication()时,我一直收到401响应.我看了Django Tastypie:如何使用API Key进行身份验证,他使用get参数来解决他的问题.如果我尝试使用get参数,它会选择用户名而不是api_key!
这适用于浏览器
http://127.0.0.1:8000/api/v1/spot/8/?username=darren&api_key=9999d318e43b8055ae32d011be5b045ad61dad50
Run Code Online (Sandbox Code Playgroud)
通过终端中的curl发送不会拾取api_key参数
curl --dump-header - http://127.0.0.1:8000/api/v1/spot/8/?username=darren&api_key=9999d318e43b8055ae32d011be5b045ad61dad50
Run Code Online (Sandbox Code Playgroud)
为什么在使用curl并附加2个查询字符串参数时?username=darren&api_key=9999d318e43b8055ae32d011be5b045ad61dad50
,它只会拾取第一个参数.这不是正确的方法吗?
我看到'对不起,还没有实现.请将"?format = json"附加到您的网址.' 我需要总是附加字符串"?format = json".我可以默认使用JSON输出吗?
此致,Vitaliy
我试图在我的自定义身份验证中覆盖is_authenticated.我有一些简单的(开始)像这样:
class MyAuthentication(BasicAuthentication):
def __init__(self, *args, **kwargs):
super(MyAuthentication, self).__init__(*args, **kwargs)
def is_authenticated(self, request, **kwargs):
return True
Run Code Online (Sandbox Code Playgroud)
然后在我的ModelResource中
class LoginUserResource(ModelResource):
class Meta:
resource_name = 'login'
queryset = User.objects.all()
excludes = ['id', 'email', 'password', 'is_staff', 'is_superuser']
list_allowed_methods = ['post']
authentication = MyAuthentication()
authorization = DjangoAuthorization()
Run Code Online (Sandbox Code Playgroud)
我一直收到500错误"error_message": "column username is not unique"
.我在数据库中只有一个用户名,而我正在尝试进行身份验证.
关于它为什么会返回此错误的任何想法?我如何允许api客户端登录?
谢谢您的帮助.
我已在此处询问有关IP身份验证的问题: 来自同一服务器的TastyPie身份验证
但是,我需要更多的东西!IP地址可能非常容易欺骗.
场景:我的API(TastyPie)和客户端应用程序(在javascript中)位于同一服务器/站点/域上.我的用户没有登录.我想在我的javascript客户端使用我的API.
问:我怎样才能确保我的(认证)AJAX请求都来自同一服务器发起?
我正在使用Tatypie.我需要验证来自客户端的请求是在同一服务器/域等上进行的.我不能使用"登录会话",因为我的用户没有登录.
我查看了私钥并生成了签名,但他们可以在javascript中查看,使该方法不安全.如果我以某种方式请求服务器的签名形式(在某些python代码中隐藏私钥),任何人都可以向get_signature
我的javascript发出相同的http请求,从而打败这一点.
我还尝试让Django视图将签名放在视图中,从而无需进行get_signature调用.这是安全的,但意味着我现在必须每次刷新页面以获得新的签名.从用户的角度来看,只有第一次调用API才能工作,之后他们需要刷新,再次毫无意义.
我无法相信我是唯一有此要求的人.这是我确定的常见情况.请帮助:)在Tastypie中使用自定义身份验证的示例也会受到欢迎.
谢谢
添加:
tastypie ×10
django ×9
python ×6
json ×2
backbone.js ×1
curl ×1
django-q ×1
javascript ×1
post ×1
rest ×1
web-services ×1