Maison >développement back-end >Tutoriel Python >Django analyse les données POST d'Angular

Django analyse les données POST d'Angular

高洛峰
高洛峰original
2017-02-18 10:36:091374parcourir

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&#39;text&#39;: u&#39;hello world&#39;, u&#39;date&#39;: u&#39;2017-01-04&#39;}>
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
car certaines

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&#39;a&#39;: [[123, 456, 444]], u&#39;b&#39;: [456]}>
<QueryDict: {u&#39;a&#39;: [123, 456, 444], u&#39;b&#39;: [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 !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn