Python之路,Day16 - Django 进阶

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

分类: Python自动化开发之路

好文要顶 关注我 收藏该文  

金角大王
关注 - 0
粉丝 - 639

+加关注

0

0

?上一篇:Python Select 解析

posted @ 2016-05-27 18:16 金角大王 阅读(756) 评论(0)  编辑 收藏

刷新评论刷新页面返回顶部

时间: 2024-12-25 19:41:52

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

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

Python之路,Day15 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效率最高的,今天就来基于下面的需求来继续学习Django 项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存6

【Python之路Day18】Python Web框架之 Django 进阶操作

Django 进阶篇 一.django的Model基本操作和增.删.改.查. 注:默认使用了sqlite3数据库 如果想使用其他数据库,请在settings里修改 1.创建数据库: 1.创建model类 在app01(或者你的app下)下models.py写入以下内容: from django.db import models # Create your models here. # 这个类是用来生成数据库表的,这个类必须集成models.Model class UserInfo(models.

Python之路Day16

主要内容:Django基础进阶之:Django 流程.Django URL.Django Views.Django Models.Django Template.Django Admin Django 流程(图片来自大王): Django URL url捕获到的参数总是字符串!!! 总的urls.py文件: 通过include导入二级(app级)的urls.py处理url app01下的urls.py文件: Django Views views主要进行逻辑处理,返回情形常见的有三种: 1. Ht

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

s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin

python之路-----搭建django框架

1.在yaolansvr 192.168.0.3上安装Python-3.4.3.tar.xz 使用Xmanager5的Xftp5将文件上传到ftp目录 2.安装源码的python 注意: (1)Ignoring ensurepip failure: pip 6.0.8 requires SSL/TLS 解决:需要安装yum -y install openssl-devel.x86_64 # yum list all|grep glibc glibc.x86_64                

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

面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) 1 class City: 2 # 静态字段 3 country = "中国" 4 5 def __init__(self,city_name): 6 # 普通字段 7 self.city_name = city_name 8 9 def show(self): 10 print(self.city_name) 11 12 13 obj1

【Python之路Day16】前端知识篇之Dom、JQuery

Dom 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口. DOM编程:可以操作html所有的标签,进行找.操作!他也是javascript的一部分 1.查找元素: 直接查找 document.getElementById('id')  查找指定的id,然后我们可以进行操作 <body> <div id ='id1'> hello </div> <script type="text

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

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

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

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')