दुर्भाग्यवश, वर्तमान में Django में इसके लिए कोई अंतर्निहित समर्थन नहीं है, जिससे @login_required
को गलती से भूल जाने पर आपको संवेदनशील जानकारी का खुलासा करने का जोखिम मिल जाता है।
middleware/security.py
:
def public(function):
"""Decorator for public views that do not require authentication
"""
orig_func = function
while isinstance(orig_func, partial): # if partial - use original function for authorization
orig_func = orig_func.func
orig_func.is_public_view = True
return function
def is_public(function):
try: # cache is found
return function.is_public_view
except AttributeError: # cache is not found
result = function.__module__.startswith('django.') and not function.__module__.startswith('django.views.generic') # Avoid modifying admin and other built-in views
try: # try to recreate cache
function.is_public_view = result
except AttributeError:
pass
return result
class NonpublicMiddleware(object):
def process_view_check_logged(self, request, view_func, view_args, view_kwargs):
return
def process_view(self, request, view_func, view_args, view_kwargs):
while isinstance(view_func, partial): # if partial - use original function for authorization
view_func = view_func.func
request.public = is_public(view_func)
if not is_public(view_func):
if request.user.is_authenticated(): # only extended checks are needed
return self.process_view_check_logged(request, view_func, view_args, view_kwargs)
return self.redirect_to_login(request.get_full_path()) # => login page
def redirect_to_login(self, original_target, login_url=settings.LOGIN_URL):
return HttpResponseRedirect("%s?%s=%s" % (login_url, REDIRECT_FIELD_NAME, urlquote(original_target)))
settings.py
:
MIDDLEWARE_CLASSES = (
#...
'middleware.security.NonpublicProfilefullMiddleware',
#...
)
, दृश्य कोड और, अंत:
from <projname>.middleware import publi
@public
def some_view(request):
#...
# Login required is added automatically
def some_private_view(request):
#...
यहाँ मेरी परियोजनाओं में से एक से एक समाधान हैइसके अलावा, आप "Automatically decorating all views of a django project" ब्लॉग पोस्ट
स्रोत
2010-02-12 21:21:26
मुझे लगता है कि यह भी कुछ मामलों में उपयोगी है * प्रतिबंधित * कुछ कार्यक्षमता अगर एक उपयोगकर्ता के प्रवेश करने के लिए उपयोग। उदाहरण के लिए, एक के लिए अनुमति नहीं देते लॉग इन उपयोगकर्ता पंजीकरण फॉर्म भरने के लिए ... इस मामले में आप संयोजन का उपयोग कर सकते हैं is_authenticated और is_anonymous का है: https://docs.djangoproject.com/en/dev/topics/auth/#authorization-for-anonymous-users – g33kz0r