2011-03-30 32 views
13

olup olmadığını kontrol edin Benim sorum genel bir, ancak özellikle benim uygulama Django için login_required dekoratör. Bir görünüm/işlev (bu durumda login_required dekoratör) Belirli bir dekoratör varsa ben bir kullanıcı giriş yaptıktan sonra yönlendirme amBir işlevin bir dekoratör

kontrol etmek için bir yol olup olmadığını

merak ediyorum, ben yönlendirmek istiyorum Şu anda üzerinde bulunan sayfanın login_required dekoratörüne sahip olması durumunda ana sayfaya. Aramalarım şimdiye kadar sonuç vermedi.

cevap

15

Kendi login_required dekoratörünüzü oluşturun ve işlevi dekore edilmiş olarak işaretleyin - muhtemelen func_dict ürününde işaretlemek için en iyi yer.

Şimdi
from django.contrib.auth.decorators import login_required as django_l_r 

# Here you're defining your own decorator called `login_required` 
# it uses Django's built in `login_required` decorator 
def login_required(func): 
    decorated_func = django_l_r(func) 
    decorated_func.func_dict['login_is_required'] = True 
    return decorated_func 

@login_required # Your decorator 
def authenticatedd_view(request): 
    pass 

def unauthenticated_view(request): 
    pass 

bir görünümü bu gibi dekore edilmiş olup olmadığını kontrol edebilirsiniz ...

# Assume `a_view` is view function 
>>> a_view.func_dict.get('login_is_required',False) 
Python dekoratörler karıştı iseniz

bu SO soru/cevaba bakınız: How to make a chain of function decorators?

+0

"işlevi süslü olarak işaretlemek"? Her bir işlevi, çıkışta yeniden yönlendirmek için uygun URL-adıyla neden işaretlemiyoruz? Bu daha doğrudan yararlı olur. –

+0

@ S.Lott Görünüm işlevine bir URL ya da URL-ismi eklemek anlamına geliyormuş gibi geliyor, bu sizin Django'da açıkça ayrılmış olan URL'lerinizi ve görünümlerinizi karıştıracağından kötü bir uygulama olacağına inanıyorum. –

+0

@Chris W .: URL-adları görünümlerde başvurulan, böylece 'reverse() işlevi görecek. Benzer şekilde, URL adları da şablonlarda referans olur, böylece {% url%} 'çalışır. "Karıştırma" ile ne demek istediğinden emin değilim. Daha fazla açıklayabilir misin? –

2

Durumunuz şu şekildedir: 1. Güvenli ve oturum açma gerektirmeyen bir dekoratörün arkasında bulunan sayfalarınız var. 2. Siz Güvenli olmayan ve hem girişli hem de anonim bir durumda ziyaret edilebilen sayfalar bulundurun.

Gereksinimlerinizi anlarsam, bir kullanıcı oturum açtığında, bir kullanıcının Ana Sayfa (Bu girişin hem Giriş hem de Anonim durumda ziyaret edilebileceği varsayılarak) olarak yeniden yönlendirilmesini istersiniz.

Neden kullanıcının yalnızca güvenli sayfalardan çıkış yapma yetisini sınırlandırmıyorsunuz ve sonra redirect_url adresinizi çıkış ekranına hoş geldiniz ekranına getiriyorsunuz?

+0

+1: Görünüm işlevleri bunun için var. Oturum kapatma işlevi, birisinin çıkış yapıp yapmamasını ve görüntülenecek sayfayı belirlemek için request.user.is_anonymous() işlevini kullanabilir. –

+0

Evet, ancak bunları günlüğe kaydetmeye ve giriş yaptıkları sayfaya yeniden yönlendirmeye çalışıyorsanız, bu sayfa/görüntünün kimlik doğrulamasıyla korunup korunmadığını bilmedikçe çalışmaz. –

İlgili konular