当前位置: 首页 > 面试题库 >

我如何使用tastypie登录django

慕祯
2023-03-14
问题内容

我正在尝试在自定义身份验证中覆盖is_authenticated。我有一个简单的东西(开始)是这样的:

class MyAuthentication(BasicAuthentication):
    def __init__(self, *args, **kwargs):
        super(MyAuthentication, self).__init__(*args, **kwargs)

    def is_authenticated(self, request, **kwargs):
        return True

然后在我的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()

我不断收到500错误"error_message": "column username is not unique"。我在数据库中只有一个用户名,这是我要验证的用户。

关于它为什么返回此错误的任何想法?我将如何允许api客户端登录?

谢谢您的帮助。


问题答案:

您的方法将尝试使用您要进行身份验证的用户名创建一个新用户。正如您所注意到的,这将在数据库层冒泡,该用户已经存在。

您想要创建一个UserResource,在其上添加一个方法,用户可以将其发布到并使用通过用户名/密码传递的数据登录。

from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from tastypie.http import HttpUnauthorized, HttpForbidden
from django.conf.urls import url
from tastypie.utils import trailing_slash

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        fields = ['first_name', 'last_name', 'email']
        allowed_methods = ['get', 'post']
        resource_name = 'user'

    def override_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/login%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('login'), name="api_login"),
            url(r'^(?P<resource_name>%s)/logout%s$' %
                (self._meta.resource_name, trailing_slash()),
                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=['get'])
        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)

现在,您可以将POST发送到http://hostname/api/user/logindata了 { 'username' : 'me', 'password' : 'l33t' }



 类似资料:
  • 问题内容: 我正在尝试在自定义身份验证中覆盖is_authenticated。我有一些简单的东西(开始),像这样: 然后在我的ModelResource中 我不断收到500错误。我在数据库中只有一个用户名,这是我要验证的用户。 关于它为什么返回此错误的任何想法?我将如何允许api客户端登录? 问题答案: 你的方法将尝试使用你要进行身份验证的用户名创建一个新用户。正如你所注意到的,这将在数据库层冒泡

  • 问题内容: 我应该如何向我的Django网站添加Google+ API登录? 问题答案: 首先,你必须为Google+创建OAuth凭据。 转到Google Developer Console 创建一个新项目。 转到“ API和身份验证”->“授权屏幕”,并为你的产品命名。点击“保存”。 转到“ API和身份验证”->“凭据”。在“ OAuth”下,单击“创建新的客户端ID”。添加“ http:/

  • 问题内容: 我正在一个springMVC项目中,其中用户身份验证基于Spring安全性。 这个想法是要拥有一个移动(android)应用程序,以便能够将某种数据发送到后端。 因此,在开始开发android之前,我决定使用cURL模拟登录表单的情况。 我们网站上的登录表单如下: 我使用以下命令: 但是我将获得登录页面,换句话说,我无法根据模拟情况通过用户身份验证。 只需注意:对于每一个请求,spri

  • 问题内容: 我正在使用OpenID。我如何做到使用户即使关闭浏览器窗口也能长时间保持登录状态? 如何存储和访问用户的对象? 基本上,我想我只是不太了解会话如何在Java中工作。 问题答案: 因此,你实际上想要一个“在此计算机上记住我”选项吗?这实际上与OpenID部分无关。这是一种与语言无关的方式: 首先创建至少包含和列的数据库表。如有必要,还添加和。我猜这些列名不言而喻。 在第一次登录(如果必要

  • Firebase 简单登录提供电子邮件/密码选项,我该如何使用它?从创建用户、为该用户存储数据开始,到登录和注销。

  • 问题内容: 我正在使用具有log4j.xml配置的第三方库-关闭日志记录的最佳方法是什么? 问题答案: 我认为所需要做的就是将阈值参数设置为OFF