Python Web开发学习CRM客户关系管理

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

2018-11-23  本文已影响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())
上一篇下一篇

猜你喜欢

热点阅读