我有一个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
一些有趣的测试:
我不知道还有什么办法可以让它在所有这些情况下都能正常工作。
为了让它现在正常工作,我必须先打电话,我知道它会失败。并等待几秒钟,直到做第二次,这将工作。因为它会立即再次失败。
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'),
任何提示?
答案 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”,它可以正常工作。