美文网首页Python Web开发学习CRM客户关系管理
【CRM客户关系管理】04.用户登录登录及访问控制

【CRM客户关系管理】04.用户登录登录及访问控制

作者: 吾星喵 | 来源:发表于2018-11-23 15:11 被阅读1次

    个人博客,欢迎查看:https://blog.starmeow.cn/

    Github地址:https://github.com/xyliurui/DjangoCRM

    登录登出功能

    登录

    创建login.html

    访问 https://v3.bootcss.com/examples/signin/ 另存网页,将文件夹Signin Template for Bootstrap_files中的样式移动到项目static对应目录,重命名Signin Template for Bootstrap.html为login.html后放在templates目录下,进行修改

    首先修改base.html,并创建css(放在前部分</head>上方)和js(放在后部分</body>上方)的块

    {% block css %}{% endblock %}
    {% block js %}{% endblock %}
    

    然后修改login.html,记得添加{% csrf_token %}

    {% extends 'base.html' %}
    {% load static %}
    {% block css %}
        <link href="{% static 'css/signin.css' %}" rel="stylesheet">
    {% endblock %}
    
    {% block body %}
        <div class="container">
            <form class="form-signin" method="post">
                <h2 class="form-signin-heading">请登录</h2>
                <label for="inputName" class="sr-only">用户名</label>
                <input type="text" id="inputName" name="username" class="form-control" placeholder="用户名" required="" autofocus="">
                <label for="inputPassword" class="sr-only">密码</label>
                <input type="password" id="inputPassword" name="password" class="form-control" placeholder="密码" required="">
                <div class="checkbox">
                    <label>
                        <input type="checkbox" value="remember-me"> 记住我
                    </label>
                </div>
                {% csrf_token %}
                <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
            </form>
    
        </div> <!-- /container -->
    {% endblock %}
    

    创建登录视图

    在项目中DjangoCRM目录下创建安views.py文件,和主urls.py在同一级

    image.png

    然后创建登录函数user_login,建议不要使用login,会和系统的函数冲突造成各类问题

    from django.shortcuts import render
    
    
    def user_login(request):
        return render(request, 'login.html')
    

    创建登录url

    修改主urls.py增加登录url

    from .views import user_login
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('crm/', include('crm.urls', namespace='crm')),
        path('login/', user_login, name='user_login'),  # 用户登录
    ]
    

    然后访问 http://127.0.0.1:8000/login/ 即会出现登录界面

    image.png

    验证登录功能

    修改DjangoCRM目录中的user_login函数

    from django.shortcuts import render, redirect, reverse
    from django.contrib.auth import authenticate, login
    
    
    def user_login(request):
        if request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
    
            # 验证帐密
            user = authenticate(username=username, password=password)
            if user:
                # 登录并生成session
                login(request, user)
                return redirect(reverse('crm:index'))
        return render(request, 'login.html')
    

    登录用户显示

    修改base.html模板,增加顶部登录用户的显示,在模板中使用request.user.is_authenticated来判断用户是否登录,如果已登录就显示用户名那个

    <ul class="nav navbar-nav navbar-right">
        <li><a href="#">功能一</a></li>
        <li><a href="#">功能二</a></li>
        {% if request.user.is_authenticated %}
            <li><a href="#">{{ request.user }}</a></li>
        {% else %}
            <li><a href="{% url 'user_login' %}">点击登录</a></li>
        {% endif %}
    </ul>
    

    登出

    创建登出视图

    在DjangoCRM目录的views.py中创建退出登录视图

    from django.contrib.auth import authenticate, login, logout
    
    
    def user_logout(request):
        logout(request)
        return redirect(reverse('user_login'))
    

    创建登出url

    修改主urls,增加登出url

    from .views import user_login, user_logout
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('crm/', include('crm.urls', namespace='crm')),
        path('login/', user_login, name='user_login'),  # 用户登录
        path('logout/', user_logout, name='user_logout'),  # 退出登录
    ]
    

    登出后回到登录界面

    登录用户及登出顶部显示

    访问 https://v3.bootcss.com/examples/navbar-static-top/ 查看网页源码,复制导航条下拉菜单功能区

    image.png

    修改base.html下拉导航

    <ul class="nav navbar-nav navbar-right">
        <li><a href="#">功能一</a></li>
        <li><a href="#">功能二</a></li>
        {% if request.user.is_authenticated %}
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ request.user }}<span class="caret"></span></a>
                <ul class="dropdown-menu">
                    <li><a href="#">用户信息</a></li>
                    <li role="separator" class="divider"></li>
                    <li class="dropdown-header">当前用户:{{ request.user }}</li>
                    <li><a href="{% url 'user_logout' %}">退出登录</a></li>
                </ul>
            </li>
        {% else %}
            <li><a href="{% url 'user_login' %}">点击登录</a></li>
        {% endif %}
    </ul>
    
    image.png image.png

    用户未登录,显示点击登录链接,登陆后,显示用户名和退出登录。

    登录错误消息提示

    修改login.html错误提示标签

    在密码框下方增加p标签,用于显示帐密输入错误的提示信息

    <p style="color: coral">{{ login_msg }}</p>
    

    增加user_login登录视图消息

    def user_login(request):
        login_msg = ''
        if request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
    
            # 验证帐密
            user = authenticate(username=username, password=password)
            if user:
                # 登录并生成session
                login(request, user)
                return redirect(reverse('crm:index'))
            login_msg = '用户名或密码错误!'
        return render(request, 'login.html', locals())
    
    image.png

    要求视图登录才能访问

    添加login_required装饰器

    有的页面只有登录后才能访问,在视图上方添加login_required装饰器

    from django.shortcuts import render
    from django.contrib.auth.decorators import login_required
    
    
    @login_required
    def index(request):
        return render(request, 'crm/index.html')
    

    settings中设置LOGIN_URL

    settings中设置如果没登录访问跳转的地方

    当访问 http://127.0.0.1:8000/crm/ 就会跳转到 http://127.0.0.1:8000/accounts/login/?next=/crm/ 改链接无法使用的,需要自定义登录URL

    在settings中添加

    # 如果没有登录,指定登录url
    from django.urls import reverse_lazy
    LOGIN_URL = reverse_lazy('user_login')
    

    会自动跳转到 http://127.0.0.1:8000/login/?next=/crm/

    获取next值跳转

    修改user_login视图,request.GET.get('next')

    def user_login(request):
        login_msg = ''
        if request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
            next_url = request.GET.get('next')
    
            # 验证帐密
            user = authenticate(username=username, password=password)
            if user:
                # 登录并生成session
                login(request, user)
                if next_url:
                    return redirect(next_url)
                return redirect(reverse('crm:index'))
            login_msg = '用户名或密码错误!'
        return render(request, 'login.html', locals())
    

    相关文章

      网友评论

        本文标题:【CRM客户关系管理】04.用户登录登录及访问控制

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