Я создал промежуточное программное обеспечение, которое позволяет мне использовать список словарей, чтобы указать некоторые правила доступа для любого из моих представлений. Каждый из этих словарей выглядит следующим образом:В каком порядке сортировать требования к соответствию пути к промежуточному программному обеспечению?
REQUIREMENTS=(
{'viewname':'addtag',
'permissions':'can_add_tags'},
{'regex':re.compile(r'^somestart'),
'user_check':lambda request:request.user.username=='sam'}
)
В моем промежуточном слое я затем попытаться выяснить, какие из этих требований соответствует текущему запросу. Для этого я фильтровать полные требования, и в функции фильтра я использовать этот код, чтобы проверить, если путь соответствует:
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-адреса самая быстрая, так что это должно быть первыми. Но тогда возникает вопрос, следует ли сначала искать регулярное выражение или функцию разрешения URL-адреса django.
Поскольку у меня сейчас нет проблем с производительностью, это скорее академический вопрос. И если бы у кого-то было бы лучшее решение для решения этого вопроса, это было бы еще лучше.
редактировать:
реагировать на данные ответы: то, что я пытаюсь сделать, это создать возможность ограничить вид нескольких внешних приложений в одном файле. Так декораторы не вариант, до тех пор, как я не хочу, чтобы сделать что-то вроде этого:
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-адреса каждый раз, когда я изменить права доступа. Я хочу этого избежать. Кроме того, мое решение позволяет функция user_check сделать проверку на пользователях, как это:
def check_user(user):
if len(Item.objects.get(creator=user,datetime=today)) > 3:
return False
return True
Это будет простым способом, т.е. ограничить количество элементов, пользователь может загрузить каждый день.. (Хорошо, это было бы возможно и с user_passes_test).
Еще одна вещь заключается в том, что я иногда хочу проверить разрешение только в том случае, если запрос является POST, или если запрос содержит определенную пару ключей: значение (например, 'action':'delete'
должно требовать разрешения, а 'action':'change'
должно быть разрешено для кто угодно). Это можно сделать и с помощью специального декоратора, но как только мне понадобится новая проверка, мне понадобится новый декоратор.
Спасибо за ваш обширный ответ. Я обновил свой вопрос, чтобы отреагировать на него. – marue