others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

django 表单 登陆 认证 退出 session

访问量:1490 创建时间:2020-01-17

本章节介绍django的表单功能,通过表单实现用户登陆认证。

通过定义一个django的form表单,将form表单映射生成html前端的form表单组件。

准备工作

初始化新项目,创建项目mysite与myapp,配置templates,INSTALL,urls.py等

#创建数据库与用户
[root@localhost 0.22]# mysql -uroot -p
Enter password: 
MariaDB [(none)]> create database mysite2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
MariaDB [(none)]> grant all on mysite2.* to 'mysite2'@'%' identified by 'mypassword';

#创建项目mysite
[root@localhost 0.22]# django-admin startproject mysite
#修改settings.py
[root@localhost mysite]# mkdir templates/
[root@localhost mysite]# vim mysite/settings.py 
ALLOWED_HOSTS = ['*'] 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite2',
        'USER': 'mysite2',
        'PASSWORD':'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
#创建应用myapp
[root@localhost mysite]# python3 manage.py startapp myapp

#django安装app
[root@localhost mysite]# vim mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]

创建表单

[root@localhost mysite]# vim myapp/forms.py
from django import forms

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

创建视图函数

[root@localhost mysite]# vim myapp/views.py 
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from myapp.forms import LoginForm
def myapp_login(request):
    if request.method == "POST":
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            formdata = login_form.cleaned_data
            user = authenticate(username=formdata['username'],password=formdata['password'])
            if user:
                login(request,user)
                return HttpResponse('登录成功')
            else:
                return HttpResponse('认证失败')
        else:
            return HttpResponse("输入不合法")
    if request.method == "GET":
        login_form = LoginForm()
        return render(request,'myapp_login.html',{"forms":login_form})

定义模板文件

[root@localhost mysite]# vim templates/myapp_login.html
<!DOCTYPE html>
<html>
<head>
  <title>django</title>
</head>
<body>
  <p>用户登陆</p>
  <form action={% url 'myapp_login' %} method="post">
    {% csrf_token %}
    {{ forms.as_p }}
    <input type="submit" value="登陆">
  </form>
</body>
</html>

forms表单的渲染选项有.as_p .as_table .as_ul

配置url

[root@localhost mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('myapp/',include('myapp.urls')),
    path('admin/', admin.site.urls),
]
[root@localhost mysite]# vim myapp/urls.py 
from django.urls import path
from . import views
urlpatterns = [
    path('myapp_login', views.myapp_login, name='myapp_login'),
]

迁移数据库,创建django超级用户

#因为没有创建新的model,不需要makemigrations生成迁移文件,直接迁移。
[root@localhost mysite]# python3 manage.py migrate
#创建超级用户
[root@localhost mysite]# python3 manage.py createsuperuser
Username (leave blank to use 'root'): 
Email address: 
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

通过python3 manage.py runserver 0.0.0.0:80命令运行django,访问你的IP:PORT/myapp/myapp_login ,输入账户root和密码验证登陆效果。

django form表单 css样式

没有css样式的form表单非常难看,通过加载bootstrap的css样式,来美化form表单。先修改form表单定义:

[root@localhost mysite]# vim myapp/forms.py 
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))
    password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))

修改模板文件

[root@localhost mysite]# vim templates/myapp_login.html
<!DOCTYPE html>
<html>
<head>
  <title>django</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<p>用户登陆</p>
<form  action={% url 'myapp_login' %} method="post">
    {% csrf_token %}

    <div class="form-group">
    {{ forms.username.label_tag }}
    {{ forms.username }}
    </div>
    <div class="form-group">
    {{ forms.password.label_tag }}
    {{ forms.password }}
    </div>
    <button type="submit" class="btn btn-default">登陆</button>
</form>
</body>
</html>

再次访问登陆页面查看效果。可以看到django的form表单已经加载了bootstrap的css样式。

django设置session

修改url配置

[root@localhost mysite]# vim mysite/urls.py 
from django.contrib import admin
from django.urls import path, include
from mysite.views import index
urlpatterns = [
    path('myapp/',include('myapp.urls')),
    path('admin/', admin.site.urls),
    path('', index),
]

[root@localhost mysite]# vim myapp/urls.py 
from django.urls import path
from . import views
urlpatterns = [
    path('myapp_login', views.myapp_login, name='myapp_login'),
    path('myapp_logout', views.myapp_logout, name='myapp_logout'),
]

修改视图函数

[root@localhost mysite]# vim myapp/views.py 
from django.shortcuts import render ,redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from myapp.forms import LoginForm
from django.contrib.auth import logout
def myapp_login(request):
    if request.method == "POST":
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            formdata = login_form.cleaned_data
            user = authenticate(username=formdata['username'],password=formdata['password'])
            if user:
                login(request,user)
                request.session['user_id']=user.id
                return redirect('/')
            else:
                return HttpResponse('认证失败')
        else:
            return HttpResponse("输入不合法")
    if request.method == "GET":
        login_form = LoginForm()
        return render(request,'myapp_login.html',{"forms":login_form})
def myapp_logout(request):
    print(request.session.get('user_id'))
    logout(request)
    return redirect('/myapp/myapp_login')


[root@localhost mysite]# vim mysite/views.py 
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
    print(request.session.get('user_id'))
    return render(request,'index.html')

创建模板文件

[root@localhost mysite]# vim templates/index.html 

<!DOCTYPE html>
<html>
<head>
  <title>django</title>
</head>
<body>
<p>index首页</p>
{{ request.user.username }}
</br>
<a href="{% url 'myapp_logout' %}">Logout</a>
</body>
</html>

修改settings.py文件

[root@localhost mysite]# vim mysite/settings.py
LOGIN_URL = '/myapp/myapp_login'     #<--新增加一行,用来做@login_required跳转

运行django,登陆后查看控制台输出的日志。

登陆评论: 使用GITHUB登陆