慕课网-Django入门到进阶-更适合Python小白的系统课程-第7章Django中的用户权限的基本使用-7-9用户登录验证授权练习bootstrap实践(4)

第7章 Django中的用户权限的基本使用

7-9 用户登录验证授权练习 bootstrap 实践(4)

1.在项目 message_test 下目录 app,修改 views.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-


import time

from django.views.generic import View
from django.shortcuts import render, redirect, reverse
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required,  permission_required
from django.contrib.auth import login
#from django.http import HttpResponse
from .models import Message
from .consts import MessageType
from .forms import MeeageForm, RegisterForm, LoginForm

class Register(View):
    TEMPLATE = 'register.html'

    def get(self, request):
        data = {}
        return render(request, self.TEMPLATE, data)

    def post(self, request):
        data = {}
        form = RegisterForm(request.POST)
        data['error'] = form.non_field_errors
        if not form.is_valid():
            return render(request, self.TEMPLATE, data)
        return redirect(reverse('five'))

class LoginView(View):
    TEMPLATE = 'login.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('five'))

        data = {}
        next_return = request.GET.get('next', '')
        data['next_return'] = next_return
        return render(request, self.TEMPLATE, data)

    def post(self, request):
        data = {}
        form = LoginForm(request.POST)

        if not form.is_valid():
            data['error'] = form.non_field_errors()
            return render(request, self.TEMPLATE, data)

        user = form.cleaned_data.get('user')
        if user:
            login(request, user)

        # next_return = form.cleaned_data('next_return')
        next_return = request.POST.get('next_return')
        if next_return:
            return redirect(next_return)

        return redirect(reverse('five'))

class LessionThree(View):
    TEMPLATE = 'three.html'
    def get(self, request, message_type):
        data = {}
        try:
            message_type_obj = MessageType[message_type]
        except Exception as e:
            data['error'] = '没有这个消息类型 {}'.format(e)
            return render(request, self.TEMPLATE, data)
        message = request.GET.get('message', '')

        if not message:
            data['error'] = '消息不可为空'
            return render(request, self.TEMPLATE, data)

        data['message'] = message
        data['message_type'] = message_type_obj

        return render(request, self.TEMPLATE, data)

class LessionFourPageOne(View):
    TEMPLATE = 'four_page_one.html'
    def get(self, request, message_type):
        data = {}
        try:
            message_type_obj = MessageType[message_type]
        except Exception as e:
            data['error'] = '没有这个消息类型 {}'.format(e)
            return render(request, self.TEMPLATE, data)

        message = request.GET.get('message', '')
        if not message:
            data['error'] = '消息不可为空'
            return render(request, self.TEMPLATE, data)

        Message.objects.create(
            content=message,
            message_type=message_type_obj.value,
            created_time=time.time()
        )

        return redirect(reverse('fourpagetwo'))

class LessionFourPageTwo(View):
    TEMPLATE = 'four_page_two.html'

    @method_decorator(permission_required('app.view_message'))
    def get(self, request):
        data ={}
        search = request.GET.get('search', '')
        if search:
            messages = Message.objects.filter(content__contains=search)
        else:
            messages = Message.objects.all()
        data['messages'] = messages
        return render(request, self.TEMPLATE, data)

class LessionFive(View):
    TEMPLATE = 'five.html'

    @method_decorator(login_required)
    def get(self, request):
        data = {}
        data['form'] = MeeageForm()
        return render(request, self.TEMPLATE, data)

    def post(self, request):
        form = MeeageForm(request.POST)
        if not form.is_valid():
            return render(request, self.TEMPLATE, {'form':form})
        content = form.cleaned_data.get('content')
        message_type = form.cleaned_data.get('message_type')
        Message.objects.create(
            content=content,
            message_type=message_type.value,
            created_time=time.time()
        )
        return redirect(reverse('fourpagetwo'))

2.在项目 message_test 下目录 app,修改 forms.py 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import jieba

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth import authenticate
from .consts import MessageType, SensitiveWordInit

MESSAGE_TYPE_CHOICES = tuple ([(message.value, message.value) for message in MessageType])

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

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if not username or not password:
            raise forms.ValidationError('用户名、密码不可为空')

        exists = User.objects.filter(username=username).exists()
        if not exists:
            raise forms.ValidationError('该用户不存在')

        user = authenticate(username=username, password=password)
        if not user:
            raise forms.ValidationError('密码错误')

        self.cleaned_data['user'] = user
        return self.cleaned_data


class RegisterForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput)
    password = forms.CharField(widget=forms.PasswordInput)
    check_password = forms.CharField(widget=forms.PasswordInput)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        check_password = self.cleaned_data.get('check_password')

        if not username:
            raise forms.ValidationError('缺少用户名')

        if not password or not check_password:
            raise forms.ValidationError('缺少密码')

        if password != check_password:
            raise forms.ValidationError('两次密码不一致')

        exists = User.objects.filter(username=username).only()
        if exists:
            raise forms.ValidationError('该用户已存在:{}'.format(username))

        user = User.objects.create_user(username=username, password=password)
        user.save()

        return self.cleaned_data

class MeeageForm(forms.Form):
    content = forms.CharField(label='消息内容', max_length=100, required=True)
    message_type = forms.CharField(
        label='数据类型',
        max_length=10,
        widget=forms.Select(choices=MESSAGE_TYPE_CHOICES)
    )

    def clean_message_type(self):
        message_type = self.cleaned_data.get('message_type')
        if not message_type:
            raise forms.ValidationError('消息类型不能为空!')
        try:
            message_type_obj = MessageType[message_type]
        except:
            raise forms.ValidationError('无效的消息类型')
        return message_type_obj

    def clean_message(self):
        content = self.cleaned_data.get('content')
        if not content:
            raise forms.ValidationError('消息不能为空')
        cut_message = jieba.lcut(content)
        check = list(set(cut_message) & set(SensitiveWordInit))
        if check:
            raise forms.ValidationError('该消息设计违禁词汇,已被屏蔽')
        return content

3.在项目 message_test 下目录 app,修改 models.py

# coding:utf-8

import time

from django.contrib.auth.models import User
from django.db import models
from .consts import MessageType

class Message(models.Model):
    user = models.ForeignKey(
        User,
        null=True,
        default='',
        on_delete=models.SET_NULL,
        related_name='message',
    )
    content = models.TextField()
    message_type = models.CharField(max_length=10, db_index=True)
    created_time = models.IntegerField(default=0)

    def __str__(self):
        return 'type:{}, content:{}'.format(self.message_type, self.content)

    @property
    def message_typ(self):
        try:
            return MessageType[self.message_type]
        except:
            return MessageType.info

    def times(self):
        _time = time.localtime(self.created_time)
        return time.strftime('%Y-%m-%d %H:%M:%S', _time)

4.在项目 message_test 下目录 templates,修改 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <style>
        .form-area {
            width: 50%;
            margin: 10% auto;
        }
    </style>
</head>
<body>
    <form class="form-area" action="{% url 'login' %}" method="post">
        {% csrf_token %}
        <div class="form-group">
            <label for="username">Username</label>
            <input type="text" class="form-control" id="username" name="username" placeholder="username" />
        </div>
        <div class="form-group">
            <label for="password">Password</label>
            <input type="password" class="form-control" id="password" name="password" placeholder="password" />
        </div>
        <input type="hidden" username="next_return" value="{{next}}"/>
        <button type="submit" class="btn btn-default">Login</button>
        <span>{{error}}</span>
    </form>
</body>
</html>

5.在项目 message_test 下命令行窗口输入修改数据库表命令

python manage.py makemigrations
python manage.py migrate

 

6.在命令行窗口进入 mysql 界面

 

posted on 2020-02-17 09:17  herisson_pan  阅读(7)  评论(0)    收藏  举报

导航