三、Django2.1 搭建多用户的博客网站——登录

目录:Django 2.1 从零开始搭建博客网站系列

服务器环境搭建(选学)

  • 在阿里云服务器从零开始上线Django项目:Ubuntu18.04+Python3+Django2,并通过公网IP访问

小试牛刀——简单的博客网站

  • 一、Django2.1 搭建简单的博客网站
  • 二、Django2.1 搭建简单的博客网站扩展——自定义模板和静态文件位置

庖丁解牛——多用户的博客网站之用户模块

  • 三、Django2.1 搭建多用户的博客网站——登录
  • 四、Django2.1 搭建多用户的博客网站——注册
  • 五、Django2.1 搭建多用户的博客网站——修改密码
  • 六、Django2.1 搭建多用户的博客网站——重置密码
  • 七、Django2.1 搭建多用户的博客网站——维护个人详细信息
  • 八、Django2.1 搭建多用户的博客网站——头像上传
  • 九、Django2.1 搭建多用户的博客网站——用户模块小结

庖丁解牛——多用户的博客网站之文章模块

  • 十、Django2.1 搭建多用户的博客网站——文章栏目
  • 十一、Django2.1 搭建多用户的博客网站——简单的文章发布
  • 十二、Django2.1 搭建多用户的博客网站——使用Markdown发布文章
  • 十三、Django2.1 搭建多用户的博客网站——修改和删除文章
  • 十四、Django2.1 搭建多用户的博客网站——向用户展示文章
  • 十五、Django2.1 搭建多用户的博客网站——文章模块小结

华丽转身——多用户的博客网站之扩展功能

  • 十六、Django2.1 搭建多用户的博客网站——文章点赞功能
  • 十七、Django2.1 搭建多用户的博客网站——统计文章浏览次数
  • 十八、Django2.1 搭建多用户的博客网站——文章评论功能
  • 十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签
  • 二十、Django2.1 搭建多用户的博客网站——文章标签
  • 二十一、Django2.1 搭建多用户的博客网站——美图模块
  • 未完待续

项目源码下载:https://github.com/jt1024/lehehe

正文:

对于一个多用户的博客系统,管理员可以从后台直接登录,比如前文中的admin,拥有所有权限;非管理员用户最好是从前台登录,只拥有部分权限。
本文我们将实现这个非管理员用户的管理后台。

1、创建应用

python manage.py startapp account

修改 ./lehehe/settings.py 中的 INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'account',  # 新增
]

修改 ./lehehe/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    path('account/', include('account.urls')),  # 新增
]

2、简单的登录

2.1 创建登录表单

新建 ./account/forms.py

from django import forms


class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

forms是什么?下面我们用 shell 来探索一下,执行下面代码进入 shell 模式

python manage.py shell 

进入shell模式后再控制台执行下列代码

from account.forms import LoginForm
login_form = LoginForm()
print(login_form)

此时会输出:



由此可见,LoginForm其实就是登录表单的HTML代码

2.2 登录函数

编辑 ./account/views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm


def user_login(request):
    if request.method == "POST":
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            cd = login_form.cleaned_data
            user = authenticate(username=cd['username'], password=cd['password'])
            if user:
                login(request, user)
                return HttpResponse("Welcome You. You have been authenticated successfully")
            else:
                return HttpResponse("Sorry. Your username or password is not right.")
        else:
            return HttpResponse("Invalid login")

    if request.method == "GET":
        login_form = LoginForm()
        return render(request, "account/login.html", {"form": login_form})
  • login_form.is_valid 在创建实例时,如果传递给表单的数据是符合表单类属性要求的,则返回True,否则返回False
  • login_form.cleaned_data 以字典的形式返回实例的具体数据。如果传入的某项数据不合法,则在cleaned_data的结果中不予显示。

2.3 登录模板

新建 .templates/account/login.html

{% extends "base.html" %}
{% block title %}Login{% endblock %}
{% block content %}

Login

Input your username and password

{% csrf_token %} {{ form.as_p }}
{% endblock %}

{% csrf_token %} :使用POST的方法时,必须添加{% csrf_token %}标签,用于处理csrf安全机制

  • {{ form.as_p }} :将表单的每个输入框包裹在一个

    标签内 tags

  • {{ form.as_table }} :将表单渲染成一个表格元素,每个输入框作为一个标签
  • {{ form.as_ul }} 将表单渲染成一个列表元素,每个输入框作为一个
  • 标签

2.4 配置路由

新建 ./account/urls.py

from django.urls import path
from . import views

app_name = 'account'  # 一定要写这一行,否则html中会报错 'account' is not a registered namespace

urlpatterns = [
    path(r'login/', views.user_login, name='user_login'),
]

2.5 测试

运行Django然后访问 http://127.0.0.1:8000/account/login/

三、Django2.1 搭建多用户的博客网站——登录_第1张图片
前台登录页面.png

填入 用户名:admin 密码:helloworld


三、Django2.1 搭建多用户的博客网站——登录_第2张图片
前台登录成功.png

2.6 修改登录模板样式

使用 {{ form.as_p }} 绘制表单,样式太普通,我们自定义表单样式。修改 .templates/account/login.html

{% extends "base.html" %}
{% block title %}Login{% endblock %}
{% block content %}

Login

Input your username and password

{% csrf_token %}
{{form.username}}
{{form.password}}
{% endblock %}

此时再访问 http://127.0.0.1:8000/account/login/ 登录表单的样式已改变

三、Django2.1 搭建多用户的博客网站——登录_第3张图片
前台登录页面修改样式.png

3、使用Django内置的登录方法

修改 ./account/urls.py

from django.urls import path
from . import views
from django.contrib.auth import views as auth_views

app_name = 'account'  # 一定要写这一行,否则html中会报错 'account' is not a registered namespace

urlpatterns = [
    # path(r'login/', views.user_login, name='user_login'),
    path(r'login/', auth_views.LoginView.as_view(template_name="account/login.html"), name='user_login'),  # 使用Django内置的登录方法
]

在 ./lehehe/settings.py 的最后添加一行代码

LOGIN_REDIRECT_URL = '/blog/'

Django内置的登录方法 LoginView()函数里有一个参数redirect_field_name=LOGIN_REDIRECT_URL,这就是登录后的重定向设置,这行代码就是我们对这个参数的配置,登录后重定向到/blog/

完善通用模板头部,修改 ./templates/header.html

{% load staticfiles %}

4、使用Django内置的登出方法

在 ./account/urls.py 里添加一行代码

path(r'loginout/', auth_views.LogoutView.as_view(template_name="account/logout.html"), name='user_logout'),  # 使用Django内置的登出方法

创建 ./templates/account/logut.html

{% extends "base.html" %}
{% block title %}Logout{% endblock %}
{% block content %}

You have log out.

You can login again

{% endblock %}

完善通用模板头部,在 ./templates/header.html 中补充 Logout 的超链接

  • Logout
  • 5、测试登录、登出效果
    登录成功页面

    登出页面

    你可能感兴趣的:(三、Django2.1 搭建多用户的博客网站——登录)