2011-01-24 3 views
3

Я заметил странное поведение с тем, как Django обрабатывает мои шаблоны url. Пользователь должен войти в систему и затем перенаправляться на страницу своего профиля. У меня также есть возможность для пользователя редактировать свой профиль.Django - view, url weirdness

Вот мои URL шаблоны для одного из моих приложений:

urlpatterns=patterns('student.views', 
    (r'profile/$', login_required(profile,'student')), 
    (r'editprofile/$', login_required(editprofile,'student')), 
) 

Это для приложения под названием студент. Если пользователь переходит к/student/profile, они должны получить представление профиля. Если они идут в/student/editprofile, они должны получить представление editprofile. Я настраиваю функцию login_required, которая выполняет некоторые проверки для пользователя. Это немного сложнее, чем я мог бы обрабатывать только с аннотациями.

Вот login_required:

def login_required(view,user_type='common'): 
    print 'Going to '+str(view) 
    def new_view(request,*args,**kwargs): 
     if(user_type == 'common'): 
      perm = '' 
     else: 
      perm = user_type+'.is_'+user_type 
     if not request.user.is_authenticated(): 
      messages.error(request,'You must be logged in. Please log in.') 
      return HttpResponseRedirect('/') 
     elif request.user.is_authenticated() and user_type != 'common' and not request.user.has_perm(perm): 
      messages.error(request,'You must be an '+user_type+' to visit this page. Please log in.') 
      return HttpResponseRedirect('/') 
     return view(request,*args,**kwargs) 
    return new_view 

В любом случае, странно то, что, когда я посещаю/студент/профиль, даже если я на нужную страницу, login_required печатает следующее:

Going to <function profile at 0x03015DF0> 
Going to <function editprofile at 0x03015BB0> 

Почему он печатает оба? Почему он пытается посетить оба?

Даже страннее, когда я пытаюсь посетить/студент/editprofile, страница профиля это то, что нагрузки, и это то, что напечатано:

Going to <function profile at 0x02FCA370> 
Going to <function editprofile at 0x02FCA3F0> 
Going to <function view_profile at 0x02FCA4F0> 

view_profile является функцией в совершенно другом приложении.

+3

Что так невыносимо о декораторах.login_required() и decorators.permission_required() ?? – hop

ответ

2

Эти две модели:

(r'profile/$', login_required(profile,'student')), 
(r'editprofile/$', login_required(editprofile,'student')), 

Оба матча http://your-site/student/editprofile.

Try:

(r'^profile/$', login_required(profile,'student')), 
(r'^editprofile/$', login_required(editprofile,'student')), 

Django использует представление, кто в данный шаблон соответствует первому (see number 3 here).

+0

ЭТО было проблемой. Я думал, что, поскольку этот urls.py был включен в другой urls.py, я НЕ использовал бы «^» впереди, но, как оказалось, мне нужно. Благодаря! – JPC

1

Ваш login_required выглядит как декоратор питона. Любая причина, по которой вам нужно иметь его в urls.py?

Я думаю, что линия print 'Going to '+str(view) оценивается, когда считывается urlpatterns, чтобы определить, какой вид выполнить. Это выглядит странно, но я не думаю, что это повредит вам.

Линия print 'Going to '+str(view) не будет выполняться каждый раз, когда будет удалено изображение, только когда будет оценен шаблон url (я думаю). Код в new_view является единственным кодом, который будет выполняться определенно как часть представления.

+0

Может быть, я могу использовать его как декоратор. Но даже по-прежнему ... хорошо, вы были правы в том, что new_view только выполняется, но почему неправильный просмотр загружается при попытке editprofile – JPC

2

Не знаю, почему вы не можете использовать стандартную @login_required декоратора - это, кажется, что ваша версия фактически обеспечивает менее функциональность, учитывая, что она всегда перенаправляет на \, а не фактической точки зрения входа.

В любом случае, причина, как печатаются потому, что print утверждение находится в верхнем уровне декоратора, и, таким образом, выполняется, когда URLconf является оценивается.Если вы поместите его во внутреннюю функцию new_view, он будет выполнен только тогда, когда он действительно вызывается, и должен печатать только соответствующее имя вида.

+0

вы были правы в заявлении о печати, однако почему неправильный вид все еще возвращается для editprofile – JPC