不需要的Apache 302重定向到相同的方法,但没有参数

时间:2014-05-07 12:37:05

标签: objective-c django apache django-rest-framework afnetworking-2

我有一个Django后端平台,我在其中使用django-rest-framework实现了一个API。

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

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

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

使用GET: 189.122.X.X - - [07 / May / 2014:14:16:50 +0200]" GET / recursos / api / district /?city_id = 3 HTTP / 1.1" 302 548 189.122.X.X - - [07 / May / 2014:14:16:51 +0200]" GET / recursos / api / district / HTTP / 1.1" 200 399

使用POST: 189.122.X.X - - [07 / May / 2014:14:16:15 +0200]" POST / recursos / api / district / HTTP / 1.1" 302 548 189.122.X.X - - [07 / May / 2014:14:16:16 +0200]" GET / recursos / api / district / HTTP / 1.1" 200 399

一些有趣的测试:

  1. 几秒钟后,从iOS应用程序到此API的任何后续GET / POST请求都已完成,正常工作
  2. 如果我通过浏览器发出请求,无论何时,它都能正常工作:不会重定向并正确处理请求
  3. 来自应用程序内部的请求使方法不属于django-rest-framework api,正常工作
  4. 我不知道还有什么办法可以让它在所有这些情况下都能正常工作。

    为了让它现在正常工作,我必须先打电话,我知道它会失败。并等待几秒钟,直到做第二次,这将工作。因为它会立即再次失败。

    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-framework中我使用了一个序列化器:

    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 个答案:

答案 0 :(得分: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”,它可以正常工作。