Python 如何使用ajax从外部html向django视图发出经过身份验证的请求
我正在使用django 1.10,我有以下html页面register.html、login.html、home.html Html页面部署在不同的应用服务器上。我使用的是自定义用户模型, 我可以注册并将详细信息存储到数据库中。还可以验证和登录应用程序,并重定向到主页 问题: 我有一个名为test的示例视图Python 如何使用ajax从外部html向django视图发出经过身份验证的请求,python,ajax,django,html,django-authentication,Python,Ajax,Django,Html,Django Authentication,我正在使用django 1.10,我有以下html页面register.html、login.html、home.html Html页面部署在不同的应用服务器上。我使用的是自定义用户模型, 我可以注册并将详细信息存储到数据库中。还可以验证和登录应用程序,并重定向到主页 问题: 我有一个名为test的示例视图 #viwes.py @login_required def test(request): l=[] l.append('x')
#viwes.py
@login_required
def test(request):
l=[]
l.append('x')
l.append('y')
return JsonResponse({"records": l})
所以在登录之后,当我直接访问url时
localhost:8000/app/test
然后我就可以在浏览器中获取数据了。
但在登录后,在同一会话中,当我从home.html调用同一url时,我无法进行身份验证和接收数据。
在浏览器控制台中,它将变为
http://127.0.0.1:8000/accounts/login/?next=/app/test/
有一些帖子将这个解决方案称为@ajax_required,因为我是django的新手,所以我没有找到任何详细的帖子。请任何人用示例解释或建议解决方案。提前谢谢 我已尝试使用以下代码和工作文件 views.py url.py 卷曲
您需要在ajax调用负载中发送
csrf
令牌来识别用户。谢谢vinay kumar。你能举个例子或者重定向到它吗?你是不是用ajax在Django应用程序的同一台服务器上托管html?我们不能在视图函数上使用@login\u required decorator而不是使用LoginRequiredMixin类。如果你使用的是类基视图,那么@method\u decorator(login\u required)
就可以了。我使用的是基于函数的视图。那么,它是否适用于我在问题中提到的视图?
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})
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 -X GET -H "Cookie: csrftoken=t1l5CpH7kL5J48yf0c4C0z9kli3UfI3enCEdT4lH8RGQip1y8f8t1l3ucDWWzRGX,sessionid=99oqphuhy1udboq4pv2icgj408b1lpxi" "http://localhost:8000/test/"