我创建了一个中间软件, 允许我使用一个词典列表, 来为我的观点指定一些访问规则。
REQUIREMENTS=(
{ viewname : addtag ,
permissions : can_add_tags },
{ regex :re.compile(r ^somestart ),
user_check :lambda request:request.user.username== sam }
)
在我的中继器件中, 我试图找出其中哪些要求符合当前要求 。 要做到这一点, 我过滤完整要求, 在过滤功能中, i 使用此代码检查路径是否匹配 :
def process_request(self,request):
def path_matches(self,req):
path_matches = False
if (req.has_key( url ) and req[ url ] == request.path ) or
(req.has_key( regex ) and req[ regex ].search(request.path)) or
(req.has_key( viewname ) and resolve(request.path).url_name==req[ viewname ]):
path_matches=True
return path_matches
requirements = filter(path_matches,REQUIREMENTS)
# now use the returned requirements to determine if a user
# matches the requirement and
现在我的问题是:我应该用什么顺序来使用检查?非常清楚的是,URL的检查是最快的,所以这必须先进行。 但问题是,是否应该先进行regex搜索或对齐的URL解析功能。
由于我目前没有任何业绩问题,这更是一个学术问题。 如果有人有更好的解决办法解决这个问题,那会更好。
<强强>编辑: 强>
要对给定的答案作出反应: im 试图做的是创造一种可能性, 在一个文件中限制对多个外部应用程序的视图。 因此, 只要我不想做这样的事情, 装饰器不是一个选项 :
from ext_app1 import view1,view2
from ext_app2 import view3
@permission_required( can_do_stuff )
def view1_ext(*args,**kwargs):
return view1(args,kwargs)
这将导致每次我更改权限时重写 URL 规格。 我希望避免这种情况。 此外, 我的解决方案允许用户_ check 函数对这样的用户进行检查 :
def check_user(user):
if len(Item.objects.get(creator=user,datetime=today)) > 3:
return False
return True
这样可以简单限制用户每天能够上传的项目数量。 ( Ok, 如果使用用户_ passes_stest 也可以这样做 ) 。
还有一点是,我有时只想要在请求为 POST 的情况下检查许可,或者如果请求包含一定的密钥:价值对(如 动作:删除
需要许可,而 动作:允许任何人更改
。这也可以使用自定义的装饰器进行,但只要我需要新检查,我就需要一个新的装饰器。