我有一个Django Web应用程序,需要在整个站点进行身份验证。我已经完成了自定义中间件,它基本上测试了request.user.is_anonymous
,如果是,则将它们重定向到登录页面。它看起来像这样:
from django.contrib.auth.views import login
from django.contrib.auth import authenticate
from django.http import HttpResponseRedirect, HttpResponse
from django.utils import simplejson
from django.core import serializers
class SiteLogin:
"This middleware requires a login for every view"
def process_request(self, request):
if request.path != '/accounts/login/' and request.user.is_anonymous():
if request.POST:
return login(request)
else:
return HttpResponseRedirect('/accounts/login/?next=%s' % request.path)
现在我正在创建一个iOS应用程序,目前,它只会从Django服务器上执行GET请求。我正在尝试使用TastyPie执行此操作,但我无法使身份验证正常工作。我正在使用ApiKeyAuthentication
,我相信,已经正确设置了它。但是,它只是将我重定向到登录页面。我想知道是否需要编辑这个中间件来处理TastyPie请求,但我认为TastyPie可以为我授权......
我觉得我的情况与this question非常相似,但我想知道我的自定义中间件是否会妨碍我。
这是我的api.py
:
from django.contrib.auth.models import User
from django.db import models
from tastypie.resources import ModelResource
from cpm.systems.models import System
from cpm.products.models import Product
from tastypie.models import create_api_key
from tastypie.authentication import ApiKeyAuthentication
from tastypie.authorization import DjangoAuthorization, Authorization
models.signals.post_save.connect(create_api_key, sender=User)
class SystemResource(ModelResource):
class Meta:
queryset = System.objects.all()
resource_name = 'system'
authentication = ApiKeyAuthentication()
authorization = DjangoAuthorization()
class ProductResource(ModelResource):
class Meta:
queryset = Product.objects.all()
resource_name = 'product'
authentication = ApiKeyAuthentication()
authorization = DjangoAuthorization()
我urls.py
的一部分:
from cpm.ios.api import SystemResource, ProductResource
from tastypie.api import Api
v1_api = Api(api_name='v1')
v1_api.register(SystemResource())
v1_api.register(ProductResource())
admin.autodiscover()
urlpatterns = patterns('',
# iOS TastyPie related:
(r'^ios/', include(v1_api.urls)),
# .... more urls....
我尝试导航到的网址是:
http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345?format=json
但我刚刚重定向到我的登录页面。我已经在教程中使用了tee,在我的Admin面板上创建了一个api密钥,并将WSGIPassAuthorization On
添加到了我的apache配置中。
有什么想法吗?
编辑我刚刚完全删除了中间件,现在我收到的只是401 AUTHENTICATION错误......
编辑2
我应该指出,如果我删除了?format=json
,那么我得到的回复为:Sorry, not implemented yet. Please append "?format=json" to your URL.
。所以它就像 进行身份验证一样,但后来失败了,因为我没有指定格式。
所以我的网址如下所示:http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345
但是只要我添加?format=JSON
,就会出现401错误。
答案 0 :(得分:2)
TastyPie请求通过与任何典型django请求相同的中间件堆栈。所以,它绝对是你的中间件。你必须重新考虑它,或者只是简单地使用@login_required。
禁用中间件后,api密钥不起作用,因为您的网址格式不正确。你不能用?在使用它之后在一个查询字符串中。试试这个网址:
http://192.168.1.130:8080/ios/v1/system/C0156/?username=garfonzo&api_key=12345&format=JSON