Python之路,Day16 - Django 进阶

 

本节内容

自定义template tags

中间件

CRSF

权限管理

分页

Django分页

https://docs.djangoproject.com/en/1.9/topics/pagination/

自定义template tags

https://docs.djangoproject.com/es/1.9/howto/custom-template-tags/

权限管理

django 自带有基本的权限管理 ,但粒度和限制权限的维度都只是针对具体的表,如果我们想根据业务功能来限制权限,那就得自己写了, 不过也不用完全自己的写,我们可以在django 自带的权限基础上轻松的实现扩展。

自己写权限要注意:

  1. 权限系统的设计对开发者、用户要实现透明,即他们不需要改变自己原有的使用系统或调用接口的方式
  2. 权限要易扩展,灵活
  3. 权限要能实现非常小的粒度的控制,甚至细致到一个按键某个用户是否能按。

想对一个功能实现权限控制,要做到只能过在views方法上加一个装饰器就行了,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@check_permission
@login_required
def customer_detail(request,customer_id):
    customer_obj = models.Customer.objects.get(id=customer_id)
    customer_form = forms.CustomerDetailForm(instance=customer_obj)
 
    if request.method == 'POST':
        customer_form = forms.CustomerDetailForm(request.POST,instance=customer_obj)
        if customer_form.is_valid():
            customer_form.save()
            parent_base_url = '/'.join(request.path.split('/')[:-2])
            print("url:",parent_base_url )
            return  redirect(parent_base_url)
        else:
            print(customer_form.errors)
    return  render(request,'crm/customer_detail.html',{'customer_form':customer_form})

check_permission的代码实现

 1 #_*_coding:utf-8_*_
2 __author__ = 'Alex Li'
3 from django.core.urlresolvers import resolve
4 from django.shortcuts import render,redirect
5
6 perm_dic = {
7 'view_customer_list': ['customer_list','GET',[]],
8 'view_customer_info': ['customer_detail','GET',[]],
9 'edit_own_customer_info': ['customer_detail','POST',['test']],
10 }
11
12 def perm_check(*args,**kwargs):
13 request = args[0]
14 url_resovle_obj = resolve(request.path_info)
15 current_url_namespace = url_resovle_obj.url_name
16 #app_name = url_resovle_obj.app_name #use this name later
17 print("url namespace:",current_url_namespace)
18 matched_flag = False # find matched perm item
19 matched_perm_key = None
20 if current_url_namespace is not None:#if didn't set the url namespace, permission doesn't work
21 print("find perm...")
22 for perm_key in perm_dic:
23 perm_val = perm_dic[perm_key]
24 if len(perm_val) == 3:#otherwise invalid perm data format
25 url_namespace,request_method,request_args = perm_val
26 print(url_namespace,current_url_namespace)
27 if url_namespace == current_url_namespace: #matched the url
28 if request.method == request_method:#matched request method
29 if not request_args:#if empty , pass
30 matched_flag = True
31 matched_perm_key = perm_key
32 print('mtched...')
33 break #no need looking for other perms
34 else:
35 for request_arg in request_args: #might has many args
36 request_method_func = getattr(request,request_method) #get or post mostly
37 #print("----->>>",request_method_func.get(request_arg))
38 if request_method_func.get(request_arg) is not None:
39 matched_flag = True # the arg in set in perm item must be provided in request data
40 else:
41 matched_flag = False
42 print("request arg [%s] not matched" % request_arg)
43 break #no need go further
44 if matched_flag == True: # means passed permission check ,no need check others
45 print("--passed permission check--")
46 matched_perm_key = perm_key
47 break
48
49 else:#permission doesn't work
50 return True
51
52 if matched_flag == True:
53 #pass permission check
54 perm_str = "crm.%s" %(matched_perm_key)
55 if request.user.has_perm(perm_str):
56 print("\033[42;1m--------passed permission check----\033[0m")
57 return True
58 else:
59 print("\033[41;1m ----- no permission ----\033[0m")
60 print(request.user,perm_str)
61 return False
62 else:
63 print("\033[41;1m ----- no matched permission ----\033[0m")
64 def check_permission(func):
65
66 def wrapper(*args,**kwargs):
67 print("---start check perms",args[0])
68 if not perm_check(*args,**kwargs):
69 return render(args[0],'crm/403.html')
70 return func(*args,**kwargs)
71 #print("---done check perms")
72 return wrapper

  

Middleware中间件

https://docs.djangoproject.com/es/1.9/topics/http/middleware/#process_request

 
 
好文要顶 关注我 收藏该文  
0
0
 
 
 
posted @ 2016-05-27 18:16 金角大王 阅读(756) 评论(0)  编辑 收藏
 
 

Python之路,Day16 - Django 进阶的更多相关文章

  1. Python之路,Day15 - Django适当进阶篇

    Python之路,Day15 - Django适当进阶篇   本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣 ...

  2. Python之路Day16

    主要内容:Django基础进阶之:Django 流程.Django URL.Django Views.Django Models.Django Template.Django Admin Django ...

  3. python开发学习-day16(Django框架初识)

    s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  4. python之路——面向对象(进阶篇)

    面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) class City: # 静态字段 countr ...

  5. python第十九天-----Django进阶

    1.机智的小django为我你们提供了快捷的表单验证! from django.shortcuts import render, HttpResponse,redirect from django i ...

  6. Python之路第六天,进阶-算法

    排序算法 冒泡排序 冒泡排序原理: 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第 ...

  7. Python之路----生成器函数进阶

    def generator(): print(123) yield 1 print(456) yield 2 g = generator() ret = g.__next__() print('*** ...

  8. 百万年薪python之路 -- 装饰器进阶

    本文链接:https://blog.csdn.net/xiemanR/article/details/72510885 一:函数装饰函数 def wrapFun(func): def inner(a, ...

  9. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

随机推荐

  1. asp.net 导入

    开发项目过程中会遇到各种各样的项目需求,我现在遇到的问题是每个部门有不同的excel文件类型,他们每个部门每个文件类型上传成功之后都会在数据库中产生表,表的列名是你excel第一行数据,其他行作为表的 ...

  2. [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】

    ---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...

  3. cf C Bear and Prime Numbers

    题意:给你一个n,输入n个数,然后输入m,接下来有m个询问,每一个询问为[l,r],然后输出在区间内[l,r]内f(p)的和,p为[l,r]的素数,f(p)的含义为在n个数中是p的倍数的个数. 思路: ...

  4. H3C S5500上层接路由,VLAN IP作网站配置实例

    # version 5.20, Release 2208 # sysname S5500-1 # clock timezone #Web#8#01 add 08:00:00 # super passw ...

  5. 我的VSTO之路(二):VSTO程序基本知识

    原文:我的VSTO之路(二):VSTO程序基本知识 开始之前,首先我介绍一下我的开发环境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0.以下的 ...

  6. 13. vs2010 ClientID bug处理

    在VS2010中的产生ClientID有几种方式,每个控件或页面有个ClientIDMode属性,可以用来决定产生ClientID的方式,它有AutoID,Static,Inherit,Predict ...

  7. Linux日志文件系统(EXT4、XFS、JFS)及性能分析

    Ext4 ReiserFS Btrfs 等七种文件系统性能比拼 自上一篇<Ext2 v.s. Ext3 v.s. Ext4 性能比拼> 发布以来,社会各界纷纷来电来函,给出了“Ext4 我 ...

  8. bzoj1978

    朴素的算法是O(n2logn)观察这个算法,似乎很难在进行优化我们就要换一种思路考虑到一个数的约数总不是很多,穷举约数也是可以在O(sqrt(x))的时间内完成的并且注意到,能否继续往下选数,只在于最 ...

  9. github上排名靠前的java项目之_storm

    1.和hadoop的比较 Storm: 分布式实时计算,强调实时性,常用于实时性要求较高的地方 Hadoop:分布式批处理计算,强调批处理,常用于数据挖掘.分析   2.Hadoop是实现了mapre ...

  10. 快速傅里叶变换(FFT):COGS 2216. 你猜是不是KMP

    2216. 你猜是不是KMP ★★★☆   输入文件:guess.in   输出文件:guess.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] XX在玩两个串的游戏. ...