Джанго - взгляд, URL странность - PullRequest
3 голосов
/ 24 января 2011

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

Вот мои шаблоны 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>

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 января 2011

Эти два шаблона:

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

Оба соответствуют http://your-site/student/editprofile.

Попробуйте:

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

Джанго использует представление, которому шаблон соответствует сначала ( см. номер 3 здесь ).

2 голосов
/ 24 января 2011

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

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

1 голос
/ 24 января 2011

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

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

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

...