慕课网-Django入门到进阶-更适合Python小白的系统课程-第9章dashboard后端的搭建与开发-9-5dashboard搭建与管理员模块开发(5)

第9章 dashboard 后端的搭建与开发

9-5 dashboard搭建与管理员模块开发(5) 

1.在项目 vedio 下目录 app/dashboard/views,修改文件 auth.py

# coding:utf-8

from django.views.generic import View
from django.shortcuts import redirect, reverse
from django.contrib.auth import login, authenticate
from django.contrib.auth.models import User
from app.libs.base_render import render_to_response

class Login(View):
    TEMPLATE = 'dashboard/auth/login.html'

    def get(self, request):
        data = {'error': ''}
        return render_to_response(request, self.TEMPLATE, data=data)

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)

        data = {}
        exists = User.objects.filter(username=username).exists()
        data['error'] = '没有该用户'
        if not exists:
            return render_to_response(request, self.TEMPLATE, data=data)

        user = authenticate(username=username, password=password)
        if not user:
            data['error'] = '密码错误'
            return render_to_response(request, self.TEMPLATE, data=data)
        if not user.is_superuser:
            data['error'] = '你无权登录'
            return render_to_response(request, self.TEMPLATE, data=data)
        login(request, user)
        return redirect(reverse('dashboard_index'))

2.在项目 vedio 下目录 app/dashboard,修改文件 urls.py 

# coding:utf-8

from django.urls import path
from .views.base import Index
from .views.auth import Login

urlpatterns = [
    path('', Index.as_view(), name='dashboard_index'),
    path('login', Login.as_view(), name='dashboard_login'),
]

3.在项目 vedio 下目录 templates/dashboard/auth,修改文件 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <link rel="stylesheet" href="/static/dashboard/css/bootstrap.min.css" />
    <link rel="stylesheet" href="/static/dashboard/css/login.css" />
</head>
<body>
<form class="form-horizontal edit-area" action="/dashboard/login" method="post">
    ${csrf_token}
    <div class="form-group">
        <div class="col-sm-10">
            <input type="text" name="username" class="form-control" placeholder="用户名">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-10">
            <input type="password" name="password" class="form-control" placeholder="密码">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-default">登录</button>${error}
        </div>
    </div>
</form>
</body>
</html>

4.在项目 vedio 下目录 app/dashboard/views,修改文件 auth.py

# coding:utf-8

from django.views.generic import View
from django.shortcuts import redirect, reverse
from django.contrib.auth import login, authenticate
from django.contrib.auth.models import User
from app.libs.base_render import render_to_response

class Login(View):
    TEMPLATE = 'dashboard/auth/login.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('dashboard_index'))
        data = {'error': ''}
        return render_to_response(request, self.TEMPLATE, data=data)

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)

        data = {}
        exists = User.objects.filter(username=username).exists()
        data['error'] = '没有该用户'
        if not exists:
            return render_to_response(request, self.TEMPLATE, data=data)

        user = authenticate(username=username, password=password)
        if not user:
            data['error'] = '密码错误'
            return render_to_response(request, self.TEMPLATE, data=data)
        if not user.is_superuser:
            data['error'] = '你无权登录'
            return render_to_response(request, self.TEMPLATE, data=data)
        login(request, user)
        return redirect(reverse('dashboard_index'))

5.测试

6.在项目 vedio 下目录 app/dashboard/views,修改文件 auth.py,添加类 AdminManger

# coding:utf-8

from django.views.generic import View
from django.shortcuts import redirect, reverse
from django.contrib.auth import login, authenticate
from django.contrib.auth.models import User
from app.libs.base_render import render_to_response

class Login(View):
    TEMPLATE = 'dashboard/auth/login.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('dashboard_index'))
        data = {'error': ''}
        return render_to_response(request, self.TEMPLATE, data=data)

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)

        data = {}
        exists = User.objects.filter(username=username).exists()
        data['error'] = '没有该用户'
        if not exists:
            return render_to_response(request, self.TEMPLATE, data=data)

        user = authenticate(username=username, password=password)
        if not user:
            data['error'] = '密码错误'
            return render_to_response(request, self.TEMPLATE, data=data)
        if not user.is_superuser:
            data['error'] = '你无权登录'
            return render_to_response(request, self.TEMPLATE, data=data)
        login(request, user)
        return redirect(reverse('dashboard_index'))

class AdminManger(View):
    TEMPLATE = 'dashboard/auth/admin.html'
    def get(self, request):
        return render_to_response(request, self.TEMPLATE)

7.在项目 vedio 下目录 app/dashboard,修改文件 urls.py  

# coding:utf-8

from django.urls import path
from .views.base import Index
from .views.auth import Login, AdminManger

urlpatterns = [
    path('', Index.as_view(), name='dashboard_index'),
    path('login', Login.as_view(), name='dashboard_login'),
    path('admin/manger', AdminManger.as_view(), name='admin_manger'),
]

8.在项目 vedio 下目录 templates/dashboard/auth,添加文件 admin.html

<%inherit file="../base.html" />

9.测试

10.在项目 vedio 下目录 templates/dashboard/auth,修改文件 base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>${self.title()}</title>
    <link rel="stylesheet" href="/static/dashboard/css/bootstrap.min.css" />
    <link rel="stylesheet" href="/static/dashboard/css/base.css" />
    ${self.css()}
</head>
<body>
<%! from django.shortcuts import reverse %>
<%include file="nav.html" />
<div id="base-area">
    <ul class="side-menu">
        <li><a href="${reverse('admin_manger')}">管理员</a></li>
        <li>用户</li>
        <li>视频</li>
    </ul>
    <div class="base-content">
        ${self.content()}
    </div>
</div>
</body>
<script src="/static/dashboard/js/jquery-1.12.4.min.js"></script>
<script src="/static/dashboard/js/bootstrap.min.js"></script>
${self.js()}
</html>

<%def name="title()"></%def>
<%def name="js()"></%def>
<%def name="css()"></%def>
<%def name="content()"></%def>

11.测试

12.在项目 vedio 下目录 templates/dashboard,修改文件 nav.html

<%! from django.shortcuts import reverse %>
<nav class="navbar navbar-default">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <a class="navbar-brand" href="${reverse('dashboard_index')}">dashboard</a>
        </div>
        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">用户 <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">注销</a></li>
                    </ul>
                </li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>

13.测试

14.在项目 vedio 下目录 app/libs,修改文件 base_render.py

# coding:utf-8

from django.conf import settings
from django.http import HttpResponse
from django.middleware.csrf import get_token
from django.template import RequestContext
from django.template.context import Context
from mako.lookup import TemplateLookup

def render_to_response(request, template, data=None):
    # 与 jinjia2 不同,mako 的模板需要自己定义,于是有了本页的代码
    context_instance = RequestContext(request)
    path = settings.TEMPLATES[0]['DIRS'][0]

    lookup = TemplateLookup(
        directories=[path],
        output_encoding='utf-8',
        input_encoding='utf-8'
    )

    mako_template = lookup.get_template(template)

    if not data:
        data = {}

    if context_instance:
        context_instance.update(data)
    else:
        context_instance = Context(data)

    result = {}
    for d in context_instance:
        result.update(d)
    result['request'] = request
    request.META["CSRF_COOKIE"] = get_token(request)
    result['request'] = request
    result['csrf_token'] = ('<div style="display:none">'
                            '<input type="hidden" '
                            'name="csrfmiddlewaretoken" '
                            'value="{0}"/>'
                            '</div>'.format(request.META['CSRF_COOKIE']))
    return HttpResponse(mako_template.render(**result)) 

15.在项目 vedio 下目录 templates/dashboard,修改文件 nav.html

<%! from django.shortcuts import reverse %>
<nav class="navbar navbar-default">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <a class="navbar-brand" href="${reverse('dashboard_index')}">dashboard</a>
        </div>
        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                <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>
                    </ul>
                </li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>

16.测试

17.在项目 vedio 下目录 app/dashboard/views,修改文件 auth.py,添加类 Logout

# coding:utf-8

from django.views.generic import View
from django.shortcuts import redirect, reverse
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.models import User
from app.libs.base_render import render_to_response

class Login(View):
    TEMPLATE = 'dashboard/auth/login.html'

    def get(self, request):
        if request.user.is_authenticated:
            return redirect(reverse('dashboard_index'))
        data = {'error': ''}
        return render_to_response(request, self.TEMPLATE, data=data)

    def post(self, request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, password)

        data = {}
        exists = User.objects.filter(username=username).exists()
        data['error'] = '没有该用户'
        if not exists:
            return render_to_response(request, self.TEMPLATE, data=data)

        user = authenticate(username=username, password=password)
        if not user:
            data['error'] = '密码错误'
            return render_to_response(request, self.TEMPLATE, data=data)
        if not user.is_superuser:
            data['error'] = '你无权登录'
            return render_to_response(request, self.TEMPLATE, data=data)
        login(request, user)
        return redirect(reverse('dashboard_index'))

class Logout(View):
    def get(self, request):
        logout(request)
        return redirect(reverse('dashboard_login'))

class AdminManger(View):
    TEMPLATE = 'dashboard/auth/admin.html'
    def get(self, request):
        return render_to_response(request, self.TEMPLATE)

 

posted on 2020-02-21 17:42  herisson_pan  阅读(4)  评论(0)    收藏  举报

导航