1

我有一个Django后端平台,我在其中使用django-rest-framework实现了一个API。不需要的Apache 302重定向到相同的方法,但没有参数

我有一个iOS应用程序,我使用AFNetworking2.0与我的API交互,都使用GET和POST,这取决于具体情况。

当我在本地运行整个平台(使用Django内部运行服务器)时,一切正常。

当用Apache运行后端时,会发生一个奇怪的问题。我的iOS应用对django-rest-framework处理的任何方法的第一个请求(无论是GET还是POST)最终都会以302重定向到同一个方法,但会丢失所有参数。例如,这是我的方法“区”的Apache的日志:

使用GET: 189.122.XX - [07/May/2014:14:16:50 +0200]“GET/recursos/api /地区/?city_id = 3 HTTP/1.1“302 548 189.122.XX - - [07/May/2014:14:16:51 +0200]”GET/recursos/api/districts/HTTP/1.1“200 399

and POST: 189.122.XX - - [07/May/2014:14:16:15 +0200]“POST/recursos/api/districts/HTTP/1.1”302 548 189.122.XX - - [07/May 2014:14:16:16 +0200]“GET/recursos/api/districts/HTTP/1.1”200 399

一些有趣的测试:

  1. 从iOS应用这个API几秒钟后任何后续的GET/POST请求已经过去了,工作正常
  2. 如果我让通过浏览器的请求,无论什么时候,它工作正常:没有按”牛逼302重定向和处理请求,从内部的应用程序,使得对方法不是Django的休息框架API的一部分正常
  3. 请求,工作正常

,我不知道还有什么为了做在所有这些情况下得到这个工作。

对于它现在的工作,我必须打第一个电话,我知道它会失败。等待几秒钟,直到做第二个,这将工作。因为立即执行它会再次失败。

的AFNetworking调用看起来像:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    NSString *method = [NSString stringWithFormat:@"%@%@", SERVER_URL, @"ws_districts"]; 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setValue:@"3" forKey:@"city_id"]; 
    [manager GET:method 
     parameters:dict 
     success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      NSLog(@"%@ %i",responseObject,city.o_id); 
     } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      NSLog(@"%@",error); 
     }]; 

在Django的REST的框架我用一个串行:

class DistrictSerializer(serializers.ModelSerializer): 
class Meta: 
    model = District 
    fields = ('id', 'name') 

在我看来的方法:

@csrf_exempt 
def districts(request): 
if request.method == 'GET': 
    city_id = request.GET.get('city_id', None) 

    queryset = District.objects.filter(city_id=city_id) 

    serializer_context = {'request': request} 
    serializer = DistrictSerializer(queryset, context=serializer_context) 

    response = JSONResponse(serializer.data) 
    return response 

elif request.method == 'POST': 
    data = JSONParser().parse(request) 
    serializer = DistrictSerializer(data=data) 
    if serializer.is_valid(): 
     serializer.save() 
     return JSONResponse(serializer.data, status=201) 
    return JSONResponse(serializer.errors, status=400) 

而且网址:

urlpatterns = patterns('views.api', 
url(r'^api/districts/$', 'districts'), 

任何提示?

+1

是否为302行执行'''print request'''? – schillingt

+0

对不起,该打印内容仅用于测试。我正在分析来自iOS应用和浏览器的请求,看看有什么不同。甚至试图将浏览器UserAgent放在标题中,但没有任何改变。 – jcardenete

+0

这很好,但你没有回答我的问题。 – schillingt

回答

0

我前一段时间终于发现了这个问题:它全部与HTTP Accept-Language头相关。

我们的Django应用程序定义了以下语言:

LANGUAGES = (
('en', ugettext('En')), 
('pt', ugettext('Pt')), 
('es', ugettext('Es'))) 

当发送请求,而不指定AcceptLanguage标头,这将最终在302

通过与“EN-US发送请求,en; q = 0.8,pt; q = 0.6,es; q = 0.4“,它工作正常。