waktu itu saat membuat aplikasi yang memerlukan fitur authentication. saya menggunakan built-in login dan logout view dari Django. untuk logout tidak ada masalah namun untuk login saya menghadapi masalah. masalahnya adalah ketika saya login dan berhasil masuk ke halaman dashboard, tanpa logout, saya bisa masuk kembali ke halaman login. nah gimana caranya untuk mencegah akses ke halaman login setelah saya berhasil login ? katanya ada yang bilang gunakan pengecekan is_authenticated dari object request di view. its ok, itu tidak masalah. yang jadi masalah adalah di sini saya tidak membuild view untuk login. kan saya katakan di awal saya menggunakan view auth milik Django (built-in). lalu bagaimana solusinya ? sebelum saya mau ngasih solusinya, saya mau berterimakasih kedapa:
blindOSXyang punya masalah yang sama dengan saya.Josh Schollyang ngedit jawaban agar mudah dimengerti.arieyang ngasih jawaban pasti tentang masalah ini.Motaneludari user Django Snipet yang telah memberikan decorator untuk masalah ini.Mark Lavinyang ngasih tau caranya gimana menggunakan decorator di dalamurlpatterns.Antonio Meleyang udah ngajarin cara bikin decorator sesuai aturan.
Sumber aslinya ada di : How to prevent the access to login page after successful login in Django?
Untuk Decoratornya ada di : Anonymous required decorator
pertama buat direktori bernama common sejajar dengan direktori proyek kamu (di dalam direktori root proyek dan app kamu). di sini nama direktori proyek saya adalah bookmarks. setelah itu buat dua file bernama __init__.py dan decorators.py. berikut ini adalah bentuk struktur direktori dan file seluruhnya:
bookmarks (project root)/
app/
urls.py
...
bookmarks/
settings.py
....
common/
__init__.py
decorators.py
trus pada bagian decorators.py isikan kode berikut ini:
from django.conf import settings
from django.http import HttpResponseRedirect
def anonymous_required( view_function, redirect_to = None ):
return AnonymousRequired( view_function, redirect_to )
class AnonymousRequired( object ):
def __init__( self, view_function, redirect_to ):
if redirect_to is None:
redirect_to = settings.LOGIN_REDIRECT_URL
self.view_function = view_function
self.redirect_to = redirect_to
def __call__( self, request, *args, **kwargs ):
if request.user is not None and request.user.is_authenticated():
return HttpResponseRedirect( self.redirect_to )
return self.view_function( request, *args, **kwargs )Setelah itu dilanjutkan dengan membuka urls.py dari direktori aplikasi lalu import decorator yang udah dibuat:
# app/urls.py
from common.decorators import anonymous_required
urlpatterns = [
# ....
]masih di dalam file yang sama (urls.py), selanjutnya gunakan fungsi anonymous_required ke view built-in Django untuk login, seperti ini:
# app/urls.py
from django.conf.urls import url
from . import views
from common.decorators import anonymous_required
from django.contrib.auth.views import login
urlpatterns = [
url(r'^login/$', anonymous_required(login), name='login'),
# ...
]selesai, saya udah coba. pertama saya login dulu abis itu saya mengakses form login kembali. dan alhasil saya langsung di bawa kembali ke halaman dashboard (kebetulan di sini saya menggunakan dashboard untuk meredirect user kalo sudah berhasil login).