如何通知应用程序凭据在 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 中成功的主要内容,如果未能解决你的问题,请参考以下文章

由于应用程序/无效凭据错误,无法发送设备推送通知

使用相同项目凭据的 GCM 的最大连接数

AWS SNS 推送通知

Twilio 可编程聊天 - 推送通知未到达

AWS Mobile推送通知示例

PushSharp - 提供给包的凭据未被识别