Bei der Verwendung von Django und Angular bin ich auf ein Problem gestoßen, bei dem Angular Daten an Django sendet.
// Angular $http({ url: "myviews", method: "POST", data: {'text': 'hello world', 'date': '2017-01-04'} })
# Django def myviews(request): print request.POST print request.body
Das Obige wird ausgedruckt
<QueryDict: {}> u"{'text': 'hello world', 'date': '2017-01-04'}"
und wir erwarten dieses Ergebnis
<QueryDict: {u'text': u'hello world', u'date': u'2017-01-04'}> u"{'text': 'hello world', 'date': '2017-01-04'}"
Dieses Problem tritt auf, weil Angular standardmäßig das gesendete Datenformat verwendet ist JSON
anstelle von urlencode
, und Djangos request.POST
kann JSON
nicht analysieren, sodass das obige Ergebnis angezeigt wird. Es gibt viele Lösungen für
. Die einfachste und gröbste Möglichkeit besteht darin, request.body
in jeder Ansichtsfunktion zu analysieren. Wir können diese Art von Operation extrahieren und als , bevor die
def myviews(request): data = urlencode(json.loads(request.body)) q_data = QueryDict(data)
Middlerware
, da einige request
-Anfragen
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
, sondern in request
umgewandelt wird, liegt darin, dass wir dem Konsistenzprinzip folgend das Ergebnis an CONTENT-TYPE
oder Header
binden wollen, und beide sind vom Typ Dict
. Der größte Unterschied zwischen QueryDict
und request.GET
besteht darin, dass request.POST
jedes QueryDict
in einer Liste speichert und QueryDict
ein nicht veränderbarer Typ ist. Wenn also Dict
eine Liste ist, müssen wir auch ein Urteil fällen, sonst wird die gesamte Liste als ein Element in der Liste von QueryDict
gespeichert. value
QueryDict
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]}>
Weitere Django-Analysen zu Angulars Beitragsdaten-bezogenen Artikeln finden Sie auf der chinesischen PHP-Website!