首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中通过REST API登录

在Django中通过REST API登录
EN

Stack Overflow用户
提问于 2017-05-10 16:07:02
回答 2查看 1.7K关注 0票数 2

我的项目有一个Django REST API服务器。它使用http://127.0.0.1:8080/api-auth/login/的内置登录系统。我有额外的Django项目,与REST服务器交互,并管理它的信息。要查看数据,首先我需要登录。所以我用forms.py创建了一个表单

代码语言:javascript
复制
   class LoginForm(forms.Form):
    username = forms.CharField(label='username', max_length=50)
    password = forms.CharField(widget=forms.PasswordInput())

和html模板:

代码语言:javascript
复制
<form action="{% url 'todolist:login' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Login" />
</form>

views.py中的适当视图

代码语言:javascript
复制
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禁区。管理授权的适当方式是什么?

EN

回答 2

Stack Overflow用户

发布于 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/

票数 0
EN

Stack Overflow用户

发布于 2017-05-10 17:11:30

在Views.py中,缺少csrf_token,因此请像这样更改代码,

代码语言:javascript
复制
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令牌。

代码语言:javascript
复制
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

在ajax成功调用中,您将获得响应并重定向到新页面,就像您在Views.py.It中提到的那样,它将加载内容而不刷新页面。

希望它能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43886826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档