我有一个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
一些有趣的测试:
- 从iOS应用这个API几秒钟后任何后续的GET/POST请求已经过去了,工作正常
- 如果我让通过浏览器的请求,无论什么时候,它工作正常:没有按”牛逼302重定向和处理请求,从内部的应用程序,使得对方法不是Django的休息框架API的一部分正常
- 请求,工作正常
,我不知道还有什么为了做在所有这些情况下得到这个工作。
对于它现在的工作,我必须打第一个电话,我知道它会失败。等待几秒钟,直到做第二个,这将工作。因为立即执行它会再次失败。
的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'),
任何提示?
是否为302行执行'''print request'''? – schillingt
对不起,该打印内容仅用于测试。我正在分析来自iOS应用和浏览器的请求,看看有什么不同。甚至试图将浏览器UserAgent放在标题中,但没有任何改变。 – jcardenete
这很好,但你没有回答我的问题。 – schillingt