我的项目有一个Django REST API服务器。它使用http://127.0.0.1:8080/api-auth/login/的内置登录系统。我有额外的Django项目,与REST服务器交互,并管理它的信息。要查看数据,首先我需要登录。所以我用forms.py创建了一个表单
class LoginForm(forms.Form):
username = forms.CharField(label='username', max_length=50)
password = forms.CharField(widget=forms.PasswordInput())和html模板:
<form action="{% url 'todolist:login' %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Login" />
</form>和views.py中的适当视图
class LoginView(View):
def get(self, request, *args, **kwargs):
form = LoginForm()
return render(request, 'login.html', {'form': form})
def post(self, request, *args, **kwargs):
form = LoginForm(request.POST)
if form.is_valid():
post_data = {'username': form.cleaned_data['username'], 'password': form.cleaned_data['password']}
response = requests.post('http://127.0.0.1:8080/api-auth/login/', data=post_data)
return HttpResponseRedirect('/todolists/')但我得到了403禁区。管理授权的适当方式是什么?
发布于 2017-05-10 16:18:55
django.middleware.csrf.get_token()用于内部获取token,请在python代码中添加带有csrf token的header,参考https://docs.djangoproject.com/en/1.11/ref/csrf/
发布于 2017-05-10 17:11:30
在Views.py中,缺少csrf_token,因此请像这样更改代码,
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
class LoginView(View):
def get(self, request, *args, **kwargs):
form = LoginForm()
return render(request, 'login.html', {'form': form})
def post(self, request, *args, **kwargs):
form = LoginForm(request.POST)
if form.is_valid():
post_data = {'username': form.cleaned_data['username'],'password': form.cleaned_data['password']}
response = requests.post('http://127.0.0.1:8080/api-auth/login/', data=post_data)
return HttpResponseRedirect('/todolists/')如果你是django 1.7以上版本,应该在django-api视图中使用@method_decorator 。
另一种方法是,您可以使用jquery将用户详细信息(用户名和密码)作为ajax中的数据执行对api的请求,并在报头中传递csrf -token值作为可以使用的csrf令牌。
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();在ajax成功调用中,您将获得响应并重定向到新页面,就像您在Views.py.It中提到的那样,它将加载内容而不刷新页面。
希望它能有所帮助!
https://stackoverflow.com/questions/43886826
复制相似问题