django开发之权限管理(二)——权限管理详解(权限的设置和中间件的用户session获取)

注意 每次开发的时候 都先要理清楚要做什么?要实现怎么样的功能?要怎么实现?
在 django中

一般分这几步走:设计url,设计视图函数,从数据库中拿数据进行渲染
这里其实是django的请求生命周期

在这里插入图片描述
1、请求生命周期

  • wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)

  • 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session

  • 路由匹配

  • 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染

  • 中间件,对响应的数据进行处理。

  • wsgi,将响应的内容发送给浏览器。

2、什么wsgi
wsgi:web服务网关接口

实现该协议的模块:

  • wsgiref(测试版本,性能特别差)
  • werkzurg
  • uwsig

wsgiref示例:

from wsgiref.simple_server import make_server
 
def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]  #字节
  
  
if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8000, run_server)
    httpd.serve_forever()

werkzeug示例:

from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
 
def run_server(environ, start_response):
    response = Response('hello')
    return response(environ, start_response)     #对象
 
if __name__ == '__main__':
    run_simple('127.0.0.1', 8000, run_server)

3、视图
FBV
url - 函数

CBV
url - view

FBV(function base view)与CBV(class base view)本质是一样的,只是fbv基于函数,cbv基于类。只不过fbv较cbv往后多执行了几步。

4、rest-framework
rest-framework从dispatch方法开始介入,执行完视图,如果有rest-framework组件,就执行rest-framework。

5、restfui规范

下面开始我们的设计
1:设计用户登录url
1.1在url中
from web.views import account

urlpatterns = [
    url(r'^login/$', account.login, name='login'),]

2:设计视图

from django.shortcuts import render, redirect, reverse
from rbac import models
from rbac.service.SetPermissions import SetPermission


def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        obj = models.User.objects.filter(name=user, password=pwd).first()

        if not obj:
            return render(request, 'login.html')
        # 重点在这呢
        # 在外边的rbac新建一个文件夹 里面存放这个初始化权限信息的函数
        # 传request是为了方便将信息存到seesion中,传入当前登录的对象是为了查出对象所具有的权限
        SetPermission(request, obj)
        # 登录成功和设置好session之后跳转到自己定义的页面 比如客户展示
        return redirect(reverse('customer_list'))

    return render(request, 'login.html')

3:查询数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/12/31 0031 17:23
# @Author : BigC
# @Site : 
# @File : SetPermissions.py
# @Software: PyCharm
# @contact: 1516499114@qq.com
from django.conf import settings


def SetPermission(request, obj):
    ret = obj.roles.all().filter(permissions__url__isnull=False
                                 ).values('permissions__url',
                                          'permissions__title',
                                          'permissions__menu',
                                          'permissions__parent',
                                          'permissions__name',
                                          'permissions__menu__title',
                                          'permissions__menu__icon',
                                          'permissions__menu__weight',
                                          'permissions__id',
                                          'permissions__name',
                                          'permissions__menu_id',
                                          ).distinct()
    menu_dict = {}
    permission_dict = {}

    print(ret)
    # {
    #     'permissions__url': 'customer/list/',
    #     'permissions__title': '查看客户',
    #     'permissions__menu': 1,
    #     'permissions__parent': None,
    #     'permissions__name': 'customer/list/',
    #     'permissions__menu__title': '查看客户',
    #     'permissions__menu__icon': 'fa-book',
    #     'permissions__menu__weight': 1
    # }
    for item in ret:
        print(item)
        permission_dict['permissions__name'] = ({
            'panme': item['permissions__parent__name'],
            'title': item['permissions_title'],
            'url': item['permissions__menu'],
            'id': item['permissions__id'],
            'pid': item['permissions__parent__id'],
        })
        menu_dict = []
        menu_id = item.get('permissions__menu_id')
        if menu_id not in menu_dict:
            menu_dict[menu_id] = {
                'title': item.get('permissions__menu__title'),
                'icon': item.get('permissions__menu__icon'),
                'weight': item.get('permissions__menu__weight'),
                'children': [{
                    'title': item.get('permissions__title'),
                    'url': item.get('permissions_url'),
                    'id': item.get('permissions__id'),
                }],
            }
        else:
            menu_dict[menu_id]['children'].append(
                {'title': item.get('permissions__title'),
                 'url': item.get('permissions_url'),
                 'id': item.get('permissions__id'), }
            )

        # 存权限
        request.session[settings.PERMISSION_SESSION_KEY] = permission_dict
        # 存菜单
        request.session[settings.PERMISSION_MENU_KEY] = menu_dict

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值