美文网首页Python相关点
Django 的登录登出功能

Django 的登录登出功能

作者: SateZheng | 来源:发表于2017-01-12 15:06 被阅读359次

    CSRF跨域请求保护

    A站为正常网站,B站为病毒网站,当我先访问A站,本地浏览器会记录cookies在本地,之后访问B站,B站会窃取我的cookies,然后通过我的cookies就可以冒名访问A站中我的账户。这就是CSRF跨站请求伪造攻击。

    Djangoform表单提交时,如果是POST方法提交,会引发CSRF跨域请求保护,解决方法为:在form表单中添加{% csrf_token %},打开网站就会在页面生成token(令牌)来进行认证,当别人登录会,页面会生成完全不一样的token,登录时抓包会发现提交的form表单中会有csrfmiddlewaretoken这么一项。

    HTML 的登录表单

    <!-- html中的登录表单-->
    <form class="form-signin" role="form" method="post" action="{% url 'login' %}">
        {% csrf_token %}
        <h2 class="form-signin-heading">Please sign in</h2>
        <input name="username" type="email" class="form-control" placeholder="Email address" required="" autofocus="">
        <input name="password" type="password" class="form-control" placeholder="Password" required="">
        
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
        <span style="color: red" >{{ login_err }}</span>
    </form>
    

    登录功能的实现

    当点击登录时,会将表单提交到urls.py中的别名为loginurl来处理,如:

    ...
    urlpatterns = [
        ...
        url(r'^login/', views.login_site, name='login'),
        url(r'^logout/', views.logout_site, name='logout'),
    ]
    

    处理逻辑为:如果方式为Post,获取到提交的usernamepassword,然后通过djangoauthenticate方法来验证。

    # 导入的login 和 logout 用来实现保持session
    from django.contrib.auth import authenticate, login, logout
    
    def login_site(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(username=username, password=password)   # 使用 Django 的 authenticate 方法来验证
            if user:
                login(request, user)    # <==
                return HttpResponseRedirect('/')
            else:
                return render(request, 'login.html', {
                    'login_err': 'Please recheck your username or password !'
                })
        return render(request, 'login.html')
    

    登出功能

    def logout_site(request):
        logout(request)     # <==
        return HttpResponseRedirect('/')
    

    HTML 页面验证是否登录

    页面中需要根据是否登录来显示登录状态,登录显示登录的用户名,未登录显示login

    ...
    <ul class="nav navbar-nav navbar-right">
        <!-- 验证是否已经登录-->
        <!-- 如果没有登录,则展示登录链接-->
        {% if not request.user.is_authenticated %}
        <li>
            <a href="{% url 'login' %}">Login</a>
        </li>
        {% else %}  
        <!-- 如果已经登录,则展示用户名和下拉菜单-->
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">{{ request.user.name }}<span class="caret"></span></a>
            <ul class="dropdown-menu" role="menu">
                <li><a href="#">个人信息</a></li>
                <li class="divider"></li>
                <li><a href="{% url 'logout' %}">Logout</a></li>
            </ul>
        </li>
        {% endif %}
    </ul>
    ...
    

    强制登录

    网站很多页面我们需要用户登录才能展示,或者说打开网站时,必须先登录。可以进行如下两步设置:

    第一步:在settings.py文件中写明当用户未登录就访问网站时的跳转路径。

    # settings.py 文件中
    LOGIN_URL = '/login/'
    

    第二步:在需要登录才能打开的页面中使用login_required装饰器

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def dashboard(request):
        return render(request, 'dashboard.html')
    ...
    ...
    

    相关文章

      网友评论

        本文标题:Django 的登录登出功能

        本文链接:https://www.haomeiwen.com/subject/xigdbttx.html