我将我的Django应用程序部署到远程服务器,但是tastypie无法识别远程服务器上的登录用户。
我有一个tastypie资源,可以过滤属于当前登录用户的所有对象:
def apply_authorization_limits(self, request, object_list):
return object_list.filter(user=request.user)
当我尝试在端点上为对象执行GET请求时,出现以下错误:
int() argument must be a string or a number, not 'AnonymousUser
我猜是因为登录无法正常工作?
还是做到了?在模板页面上,我有以下代码:
{% if user.is_authenticated %}
Logged in as <strong>{{ user.username }}</strong>
<a href="/users/logout">Logout</a>
{% else %}
<a href="/users/signup">Signup</a>
<a href="/users/login">Login</a>
{% endif %}
代码正确显示用户的用户名(这意味着用户已经过身份验证)。可能会发生什么?在我的本地服务器上,我能够成功完成对tastypie API的所有HTTP请求,而我不是AnonymousUser,但在我的远程服务器上,我被称为Tastypie的AnonymousUser
编辑: 当我在任何视图中打印出request.user的print语句时,我得到了正确的登录用户。当我在Tastypie api.py中有一个打印声明打印出request.user时,我就称为AnonymousUser。为什么我会被称为Tastypie的AnonymousUser而不是其他应用程序?
编辑: 我使用以下身份验证:
authentication = Authentication()
如果我将身份验证更改为ApiKeyAuthentication,那么我必须将每个GET / POST请求的用户名和api密钥发布到资源。这样做的问题是我必须创建一个新的中间视图,查询用户名和视图,然后对Tastypie端点进行GET / POST。还有其他解决方案吗? 第二种方法是将用户名和apikey嵌入到webapp中,让JS获取这些值并将它们添加到GET / POST查询字符串,但这可能会导致安全问题。这将是一个安全问题,因为如果用户拥有用户名和api密钥,用户可能会假装成另一个用户。
答案 0 :(得分:1)
首先:APIKeyAuth:这是一个问题,就像另一个用户获得用户名和密码,或者通过不安全的连接获得会话ID一样。
第二:如果你想使用基于会话的身份验证(它只适用于浏览器,对于当前登录的用户)你需要创建自己的身份验证后端,详见http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html#implementing-your-own-authentication-authorization <的文档/ p>
从那里向上滚动一下,并阅读有关您选择的身份验证方法的令人讨厌的警告。