2017-02-24 1 views
0

J'utilise django 1.10, je suit pages html register.html, login.html, home.htmlComment puis-je faire une demande authentifiée à django vue de html externe en utilisant ajax

pages Html sont déployées sur différentes applications serveur. J'utilise le modèle d'utilisateur personnalisé, Je peux enregistrer et stocker des détails dans la base de données. Aussi capable de s'authentifier et se connecter à l'application et être redirigé vers la page d'accueil.

Problème: J'ai vue échantillon nommé, le test

#viwes.py 
    @login_required 
    def test(request): 
     l=[] 
     l.append('x') 
     l.append('y') 
     return JsonResponse({"records": l}) 

donc après la connexion, lorsque j'accède directement url comme,

localhost:8000/app/test 

alors je suis en mesure d'obtenir des données dans le navigateur. Mais après la connexion, au cours de la même session, lorsque j'appelle la même URL depuis home.html, je ne suis pas en mesure d'authentifier et de recevoir des données. Dans la console du navigateur, il deviendra aussi,

http://127.0.0.1:8000/accounts/login/?next=/app/test/ 

Il y avait quelques postes qui renvoie la solution comme @ajax_required, comme je suis nouveau à django, je ne trouve pas un poste en détail. Quelqu'un peut-il s'il vous plaît expliquer ou suggérer une solution avec exemple de l'échantillon. Merci d'avance.

+0

Vous devez envoyer 'CSRF 'jeton dans la charge utile d'appel ajax pour identifier l'utilisateur. –

+0

Merci vinay kumar. Pouvez-vous donner un exemple ou rediriger vers celui-ci. – sachin27

+0

Dou vous hébergez votre html avec ajax sur le même serveur que Django app? – giaco

Répondre

0

J'ai essayé avec le code ci-dessous et fichier de travail

views.py

from django.contrib.auth.decorators import login_required 
from django.http.response import JsonResponse 
from django.views.generic.base import View 

class LoginRequiredMixin(object): 
    @classmethod 
    def as_view(cls, **initkwargs): 
     view = super(LoginRequiredMixin, cls).as_view(**initkwargs) 
     return login_required(view) 


class TestLogin(LoginRequiredMixin, View): 

    def get(self, request, *args, **kwargs): 
     l = [] 
     l.append('x') 
     l.append('y') 
     return JsonResponse({"records": l}) 

urls.py

from django.conf.urls import url 
from django.contrib import admin 

from myapp.views import TestLogin 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^test/$', TestLogin.as_view(), name='testview'), 
] 

Curl

curl -X GET -H "Cookie: csrftoken=t1l5CpH7kL5J48yf0c4C0z9kli3UfI3enCEdT4lH8RGQip1y8f8t1l3ucDWWzRGX,sessionid=99oqphuhy1udboq4pv2icgj408b1lpxi" "http://localhost:8000/test/" 
+0

ne pouvons-nous pas simplement utiliser la fonction @login_required décorator on view au lieu d'utiliser la classe LoginRequiredMixin. – sachin27

+0

Si vous utilisez la vue de base de la classe, alors '@method_decorator (login_required)' sera correct. –

+0

J'utilise des vues basées sur les fonctions. Est-ce que cela fonctionne pour la vue comme mentionné dans ma question? – sachin27