Django搭建个人博客----登录和登出

用户的登录和登出

之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是articlebloguser

登录

1. 配置根路由

打开iblog/urls.py

    path('bloguser/', include(('bloguser.urls', 'bloguser'), namespace='bloguser')),

2. 配置子路由

打开bloguser/urls.py

    path('user_login/', views.user_login, name='user_login'),

3. 建立表单form

在bloguser中,新建forms.py

bloguser/forms.py

from django import forms

class UserLoginForm(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(required=True, min_length=6, max_length=20, error_messages={
        'required': '密码必须填写',
        'min_length': '密码不能低于6位',
        'max_length': '密码不能超过15位'
    })

4. 编写Views(视图)

bloguser/views.py

def user_login(request):
    if request.method == 'POST':
        user_login_form = UserLoginForm(request.POST)
        # 判断表单数据是否完整
        if user_login_form.is_valid():
            # 获取表单数据
            data = user_login_form.cleaned_data
            user = authenticate(username=data['username'], password=data['password'])
            if user:
                # django自带的登录方式,登录信息保存在session中
                login(request, user)
                return redirect(reverse('blog:index'))
            else:
                context = {
                    'msg': '账号或密码错误'
                }
                return render(request, 'login.html', context)
        else:
            context = {
                'msg': '请输入完整的信息'
            }
            return render(request, 'login.html', context)
    else:
        user_login_form = UserLoginForm()
        context = {
            'form': user_login_form
        }
        return render(request, 'login.html', context)
  • 一定要先判断是否是POSt请求,还是其他请求,我们这里将请求方式分为两种,POST实现登录,其他的跳转登录页面。

  • Form表单的主要作用为:

  • 生成HTML标签

  • 验证数据

  • 初始化页面内容

  • authenticate()方法验证用户名称和密码是否匹配.(用户必须是AbstractUser和User).

  • login()是Django自带的登录方式,登录信息存在session中,关于session后面讲,简单说就是互联网的会话验证信息。

5. 登录页面(templates)

templates/login.html

<div class="card-body">
                        <form method="POST" action="{% url 'bloguser:user_login' %}" class="needs-validation">
                            {% csrf_token %}
                            <div class="form-group">
                                <label for="username">用户名</label>
                                <input id="username" type="username" class="form-control" name="username"
                                       tabindex="1" required autofocus>
                                <div class="invalid-feedback">
                                    Please fill in your username
                                </div>
                            </div>

                            <div class="form-group">
                                <label for="password" class="d-block">密码
                                    <div class="float-right">
                                        <a href="#">
                                            Forgot Password?
                                        </a>
                                    </div>
                                </label>
                                <input id="password" type="password" class="form-control" name="password"
                                       tabindex="2" required>
                                <div class="invalid-feedback">
                                    please fill in your password
                                </div>
                            </div>

                            <div class="form-group">
                                <button type="submit" class="btn btn-primary btn-block" tabindex="4">
                                    登录
                                </button>
                            </div>
                        </form>
                    </div>

6. 登录接口

templates/index.html

                <li class="nav-item">                    
                    <a class="nav-link" href="{% url 'bloguser:user_login' %}">登录{{ user.username }}</a>               
                </li>

运行后程序,打开http://127.0.0.1:8000/bloguser/user_login/

然后输入用户账户和密码,点击登录,就登录成功啦。

这里为了判断是否登录成功,我们可以在登录的地方加一个标识,以后再优化,这里只是做一个标识。即登录成功后,会打印出用户的登录用户名。


用户退出

1. 配置子路由

打开bloguser/urls.py

    path('user_logout', views.user_logout, name='user_logout'),

2. 编写Views(视图)

bloguser/views.py

# 退出
def user_logout(request):
    logout(request)
    request.session.flush()
    return redirect(reverse("article:index"))
  • logout()login()一样,Django自带

  • 我这里使用flush()删了一次session,此处可以不写,无影响。

编写接口(templates)

templates/index.html

                <li class="nav-item">                
                    <a class="nav-link" href="{% url 'bloguser:user_logout' %}">退出</a>                
                </li>

运行程序,进入首页,点击退出,会发现用户名消失,即退出成功 

到这里,登录和退出就讲完了。有问题一起交流呀,再说一次,页面需要美化,代码需要优化,这只是为了很直观的说明而做的。




上一篇: Django搭建个人博客----文章详情页面
下一篇: Django 管理图片