1
votes

L'appel AJAX ne fonctionne pas pour l'envoi de jetons à l'API dans Django

J'ai un jeton et je dois le transmettre à une API (créée dans views.py) afin de récupérer une heure générée. J'ai utilisé Simple-JWT pour la génération de jetons mais je ne suis pas en mesure de l'envoyer à l'URL spécifiée. Voir mon code ci-dessous:

models.py:

headers: { "Authorization": 'Bearer ' + access_token }
success: function(data) {  
    console.log(headers);
..... //remaining code

views.py:

XXX

serializers.py:

Uncaught SyntaxError: Unexpected identifier

urls.py: p >

{% block javascript %}
    <script type="text/javascript">
        $('#get_time').click(function () {
            var access_token = localStorage.getItem('access');  #stored the token before in localStorage
            $.ajax({
                cache: false,  
                url: {% url 'time_api' %},
                method: 'GET', 
                // datatype: 'json',
                headers: { "Authorization": 'Bearer ' + access_token }
                success: function(data) {  
                    console.log(headers);
                    document.getElementById("display_time").innerHTML(data);
                },
                error: function(xhr, ajaxOptions, thrownError) {
                    console.log("No data");
                }
                });
        });

    </script>

{% endblock javascript %}

interface.html:

{% block content %}
        <form method="POST">           
            <button type="button" class="btn btn-outline-info" id ='get_time'> Punch In </button> 
            <h4 id='display_time'></h4>
        </form>

{% endblock content%}

Code JS (dans la page HTML):

urlpatterns = [
     # ...,
     path('time_api/',TimeAPI.as_view(), name = 'time_api'),
]

Après avoir cliqué sur le bouton dans ma page HTML, je ne récupère pas l'heure générée. En fait, rien ne se passe.

Voici l'erreur dans la console JS:

class MySerializer(serializers.ModelSerializer):

    class Meta:
        model = My_time
        fields = ('time')

et elle pointe vers la fonction de succès dans AJAX:

#API to get back time (if existing) or create a new time and send it back to the HTML page via AJAX.

class TimeAPI(generics.ListAPIView):
    permission_classes = [IsAuthenticated] 
    serializer_class = MySerializer
    def get_queryset(self, request):
        current_time = timezone.now()
        if (My_time.objects.filter(time=current_time) in (None, '')): 
            time = My_time.objects.create(time=current_time) #saves it to my database
        else:
            pass
        data = My_time.objects.values_list('time', flat=True)
        return data #should return the data to the HTML page

Quelqu'un peut-il expliquer ce qui ne va pas? Merci


0 commentaires

5 Réponses :


0
votes

essayez d'utiliser les outils de développement du navigateur et vérifiez la sortie de la console js et incluez-la ici et essayez également de remplacer la méthode get de votre CBV et de vérifier if self.request.is_ajax et de renvoyer les données vous avez besoin. cela pourrait être le problème


3 commentaires

J'ai ajouté le message d'erreur. S'il vous plaît, jetez un oeil.


et peut-être modifier votre gestionnaire d'erreurs js pour prendre l'argument data uniquement comme error: function (data) {console.log ('No data'); console.log (data);} puis vérifiez ce que la console js imprime.


La méthode get est celle chargée de renvoyer les données aux modèles, la méthode get_queryset contrôle les données incluses dans la réponse et peut être utilisée pour filtrer les objets à renvoyer



0
votes

modifiez votre gestionnaire d'erreurs pour n'accepter que l'argument data et enregistrez-le dans la console.

l'erreur est dans la fonction js


2 commentaires

J'ai supprimé le gestionnaire d'erreurs. Mais il fait toujours la même chose. Il n'accède pas à l'API


Dois-je changer pour obtenir la méthode au lieu de get_queryset?



0
votes

définir une nouvelle méthode def get (self, request): queryset = self.get_queryset () # construire votre réponse html et construire une réponse json et returñ que alors en js accède à la valeur des données avec data.value


2 commentaires

si vous retournez un json, définissez le contenu html avec `document.getElementById ('your_id'). text (data.value)


Merci pour votre réponse, mais est-il possible de mettre en forme votre réponse? Je ne peux pas le comprendre, désolé.



0
votes

définir une nouvelle méthode def get (self, request): queryset = self.get_queryset () # construire votre réponse html et construire une réponse json et returñ que alors en js accède à la valeur des données avec `data.value


0 commentaires

0
votes
from rest_framework.response import Response

def get(self, response):
    data = self.get_queryset()
    # assuming data is a dict object
    return Response(data)

0 commentaires