2016-07-14 3 views
1

Ich djangorestframework==3.3.3 und Django==1.9.4 mitDjango Rastrahmen APIClient analysiert keine Abfrageparameter

Ich habe einen Test, wo ich will richtig, dass die Abfrageparameter verarbeitet überprüfen.

class TestResourceView(APITestCase): 

    def test_view_process_query_params_correctly(self): 
     client = APIClient() 
     client.login(username='<username>', password='password') 
     response = client.get('/api/v2/resource/1/users/?fields=first_name;last_name') 
     self.assertEqual(response.status_code, 200) 
     # .... rest of the test .... 

Aus meiner Sicht habe ich print Aussage nur um zu sehen, ob Abfrageparameter richtig analysiert werden, aber ich bekomme leere Abfrage Wörterbuch:

class Resource(APIView): 
    def get(self, request): 
     query_params = request.query_params 
     print('Printing query params') 
     print(query_params) 
     # .... rest of the code .... 

    def post(self, request): 
     query_params = request.query_params 
     print('Printing query params') 
     print(query_params) 
     # .... rest of the code .... 

Ergebnis im Terminal, wenn Tests ausgeführt werden:

Printing query params 
<QueryDict: {}> 

In der gleichen Zeit, wenn ich post Anfrage wie folgt testen:

response = client.post('/api/v2/resource/1/users/?fields=first_name;last_name') 

i erhalten params falsch analysiert:

Printing query params 
<QueryDict: {'last_name': [''], 'fields': ['first_name']}> 

Was ist der richtige Weg APIClient zu verwenden? Oder ist das immer noch ein Fehler? Weil es bereits ähnlich war issue

Antwort

0

Das Format Ihrer Abfrageparameter ist falsch. Wenn Sie möchten, dass das Ergebnis {'fields': ['last_name', 'first_name']} lautet, sollte Ihre POST-URL .../users/?fields=first_name&fields=last_name' lauten. Wahrscheinlich möchten Sie mit getlist() auf die Parameter zugreifen.

+0

Die Idee ist, Abfrageparameter zu erhalten und sie so zu analysieren, wie ich brauche. Zum Beispiel könnte es params wie folgt geben:/api/v2/resource/1/users /? Fields = erster_name; nachname_, das in die Menge '{'first_name', 'last_name'}' geparst wird. Eine weitere Option '/ api/v2/resource/1/users /? Fields = 1-4', die unter der Haube in die Menge' {'first_name', 'last_name', 'phone', 'skype' geparst wird } '. Und noch, ein anderes Problem bleibt 'client.get ('/ api/v2/resource/1/users /? Fields = first_name; last_name')' ergibt leer 'query_params' – AmirM

0

1) In Bezug auf leere <QueryDict: {}> in client.get('/api/v2/resource/1/users/?fields=first_name;last_name') - da war mein Fehler in meinem Code. Ich hatte zwei Tests mit dem gleichen Namen, von denen einer in der Tat leer <QueryDict: {}> ist. Also, beim Ausführen von Tests, führte Django den Test mit <QueryDict: {}>

2) In Bezug auf inkorrekte Parsing von Abfrageparameter in client.post('/api/v2/resource/1/users/?fields=first_name;last_name'), fand ich die folgenden discussion. Also, django folgt im Grunde HTTP-Standards, wobei gesagt wird, dass ; Semikolon reservierten Charakter ist und wenn Sie verwenden, als die richtige Weise, es zu verstehen, wie &. Hier mehr details

Verwandte Themen