Dans le processus d'utilisation de Django et Angular, j'ai rencontré un problème où les données Angular POST étaient envoyées à Django.
// Angular $http({ url: "myviews", method: "POST", data: {'text': 'hello world', 'date': '2017-01-04'} })
# Django def myviews(request): print request.POST print request.body
Ce qui précède s'imprimera
<QueryDict: {}> u"{'text': 'hello world', 'date': '2017-01-04'}"
et nous attendons ce résultat
<QueryDict: {u'text': u'hello world', u'date': u'2017-01-04'}> u"{'text': 'hello world', 'date': '2017-01-04'}"
Ce problème se produit parce que les valeurs par défaut angulaires Le format de données envoyé est JSON
au lieu de urlencode
, et le request.POST
de Django ne peut pas analyser JSON
, donc le résultat ci-dessus apparaît. Il existe de nombreuses solutions pour
. La manière la plus simple et la plus grossière est d'analyser request.body
dans chaque fonction de vue
def myviews(request): data = urlencode(json.loads(request.body)) q_data = QueryDict(data)
Nous pouvons extraire ce type d'opération et l'écrire sous la forme , avant que la requête Middlerware
n'atteigne la fonction d'affichage, elle sera traitée uniformément request
class JSONMiddleware(object): """ Process application/json requests data from GET and POST requests. """ def process_request(self, request): if 'application/json' in request.META['CONTENT_TYPE']: data = json.loads(request.body) q_data = QueryDict('', mutable=True) for key, value in data.iteritems(): if isinstance(value, list): for x in value: q_data.update({key: x}) else: q_data.update({key: value}) if request.method == 'GET': request.GET = q_data if request.method == 'POST': request.POST = q_data return None
requêtes n'ont pas request
ceci CONTENT-TYPE
, il faut donc juger, La raison pour laquelle il n'est pas simplement converti en Header
mais en Dict
est que, suivant le principe de cohérence, nous voulons lier le résultat à QueryDict
ou request.GET
, et ils sont tous deux de type request.POST
. La plus grande différence entre QueryDict
et QueryDict
est que Dict
stocke chacun QueryDict
dans une liste, et value
est un type non modifiable. Ainsi, lorsque QueryDict
est une liste, nous devons également porter un jugement, sinon la liste entière sera stockée comme un seul élément dans la liste de value
. QueryDict
a = {"a": [123, 456, 444], "b": 456} # 不做判断 data = QueryDict('', mutable=True) for k, v in a.iteritems(): data.update({k: v}) print data # 做判断 data = QueryDict('' mutable=True) for k, v in a.iteritems(): if isinstance(v, list): for x in value: data.update({k: x}) else: data.update({k: v}) print data
<QueryDict: {u'a': [[123, 456, 444]], u'b': [456]}> <QueryDict: {u'a': [123, 456, 444], u'b': [456]}>
Pour plus d'analyses Django des articles liés aux données de publication d'Angular, veuillez suivre le site Web chinois de PHP !