Django analyse les données POST d'Angular

高洛峰
Libérer: 2017-02-18 10:36:09
original
1362 Les gens l'ont consulté

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'}
})
Copier après la connexion
# Django
def myviews(request):
    print request.POST
    print request.body
Copier après la connexion

Ce qui précède s'imprimera

<QueryDict: {}>
u"{'text': 'hello world', 'date': '2017-01-04'}"
Copier après la connexion

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'}"
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion
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
Copier après la connexion
<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]}>
Copier après la connexion
                                     


Pour plus d'analyses Django des articles liés aux données de publication d'Angular, veuillez suivre le site Web chinois de PHP !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal