如何通知应用程序凭据在 Django/Tastypie/REST 中成功
Posted
技术标签:
【中文标题】如何通知应用程序凭据在 Django/Tastypie/REST 中成功【英文标题】:How to notify an app that credentials were successful in Django/Tastypie/REST 【发布时间】:2015-04-07 16:22:57 【问题描述】:我有点理解登录如何与 TastyPie 和 Django 一起工作,但有一件事让我很困扰。 曾经像
"username": username,"password":password or "apikey":apikey
由HttpRequest通过api发送并完成必要的身份验证,移动应用程序如何知道它是成功的? 我将使用什么代码告诉本机应用身份验证成功,因此它可以继续。
我在 SO 上找到了这段代码并理解了其中的一部分,但对于非浏览器应用程序,它怎么知道?
类用户资源(模型资源):
class Meta:
queryset = User.objects.all()
resource_name = 'user'
allowed_methods = ['post']
def prepend_urls(self):
return [
url(r"^user/login/$", self.wrap_view('login'), name="api_login"),
url(r"^user/logout/$", self.wrap_view('logout'), name='api_logout'),
]
def login(self, request, **kwargs):
self.method_check(request, allowed=['post'])
data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json'))
username = data.get('username', '')
password = data.get('password', '')
user = authenticate(username=username, password=password)
if user:
if user.is_active:
login(request, user)
return self.create_response(request,
'success': True
)
else:
return self.create_response(request,
'success': False,
'reason': 'disabled',
, HttpForbidden )
else:
return self.create_response(request,
'success': False,
'reason': 'incorrect',
, HttpUnauthorized )
def logout(self, request, **kwargs):
self.method_check(request, allowed=['post'])
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)
编辑:
问的不同... 如何通知这个独立的 python 脚本:
url="http://127.0.0.1:8000/articles/api/article/"
data=
'title':'Tastypie Madness',
'body':'First Restful client. Enjoy',
'pub_date':str(time.strftime('%Y-%m-%d %H:%M:%S')),
files= 'thumbnail': open('car.jpg', 'rb')
req = requests.post(url, data=data, files=files)
通过这个api成功创建并保存的对象:
类 ArticleResource(ModelResource):
class Meta:
queryset = Article.objects.all()
resource_name = 'article'
filtering = 'title': ALL
authorization=Authorization()
def deserialize(self, request, data, format=None):
if not format:
format = request.META.get('CONTENT_TYPE', 'application/json')
if format =='application/x-www-form-urlencoded':
data = request.POST.copy()
photo = Article()
photo.title = request.POST.get('title')
photo.body=request.POST.get('body')
photo.pub_date = request.POST.get('pub_date')
photo.save()
return data
if format.startswith('multipart'):
data = request.POST.copy()
photo = Article()
photo.thumbnail = request.FILES['thumbnail']
photo.title = request.POST.get('title')
photo.body=request.POST.get('body')
photo.pub_date = request.POST.get('pub_date')
photo.save()
# ... etc
return data
return super(ArticleResource, self).deserialize(request, data, format)
# overriding the save method to prevent the object getting saved twice
def obj_create(self, bundle, request=None, **kwargs):
pass
并在屏幕上打印“成功发布”。
【问题讨论】:
如何在你的客户端中得到服务器的应答? @spectras 是的,这就是我要问的。我必须手动请求吗? 好吧,您的客户端应用程序将提交请求,就像您写的那样。服务器将执行某些操作,然后发回您的客户端应用程序将解析的答案。示例代码已经这样做了,唯一的问题是:你有什么样的客户端应用程序?基于浏览器的jQuery?一些电话框架?您需要知道如何使用您的特定工具包获得答案。这是客户端问题,不是服务器问题。服务器已经在发送答案了。 @spectras 哦,我想我开始明白了。感谢您的回答,为简单起见,假设我编写了一个客户端独立 python 脚本,其唯一目的是发送用户名/密码组合并获得成功/失败响应,并将其打印到屏幕上。所以不是基于浏览器的。我该怎么做? 导入请求,json; print(requests.post(url, data=json.dumps("username": username,"password":password)).text) 【参考方案1】:特别是在您的代码中:
req = requests.post(url, data=data, files=files)
如果 req.status_code == 200,那么您已正确验证。看起来您正在使用请求库,这里有一些关于响应内容的外观以及如何访问它的更多信息:
http://docs.python-requests.org/en/master/user/quickstart/#json-response-content
【讨论】:
以上是关于如何通知应用程序凭据在 Django/Tastypie/REST 中成功的主要内容,如果未能解决你的问题,请参考以下文章