2016-09-30 2 views
0

사용자가 Google에 로그인 할 수 있도록 소셜 인증을 구현했습니다. 소셜 인증 시스템으로 로그인하지 않은 방문자가 UpdateView, ListView 또는 CreateView와 같은 일반보기에 액세스하지 못하도록 제한하는 방법을 이해할 수 없습니다. . 여기에 코드가 있습니다.Django 일반보기를 로그인 한 사용자 만 액세스 할 수있게 만드는 방법은 무엇입니까?

views.py

class AchievementCreate(CreateView): 
    form_class = AchievementForm2 
    model = Achievements 
    def form_valid(self, form): 
      achieves = form.save(commit=False) 
      achieves.resume = Resume.objects.get(pk=2) 
      return super(AchievementCreate, self).form_valid(form) 

def home(request): 
#logout(request) 
    uname="" 
    if request.method == 'POST' and 'submit' in request.POST: 
     submit = request.POST['submit'] 
     if submit=="sign-out": 
      logout(request) 

    if '_auth_user_id' in request.session: 
     uname=sm.UserSocialAuth.objects.get(
     user_id=int(request.session['_auth_user_id']) 
     ).user 
     request.session['uname']=str(uname) 
    return render(request,'cv/home.html',{'uname': uname}) 

home.html을

<!DOCTYPE html> 
    <html> 
    <head> 
     <meta charset="utf-8"/> 
     <title>Home</title> 
    </head> 
    <body> 
     <form method="post" action="{% url 'cv:home' %}">{% csrf_token %} 
      {% if uname %} 
       Helo, {{uname}}<br> 
       The user already signed in. He may need to sign out<br> 
       <input type="submit" name="submit" value="sign-out">    
      {% else %} 
       Please sign-in<br> 
       <a href="{% url 'social:begin' 'google-oauth2' %}">Google login</a> 
      {% endif %} 
     </form> 
    </body> 
    </html> 

urls.py

,536,
urlpatterns = [ 
url(r'^$', views.IndexView.as_view(), name='index'), 
url(r'^achievements/(?P<pk>[0-9]+)/delete/$', views.AchievementDelete.as_view(), name='achievement-delete'), 
url(r'^achievements/(?P<pk>[0-9]+)/$', views.AchievementUpdate.as_view(), name='achievement-update'), 
url(r'^achievements/add/$', login_required(views.AchievementCreate.as_view()), name='achievement-add'), 
url(r'^home/$', views.home, name='home'),] 

사용자가 로그인 한 경우에만 "AchievementCreate"클래스에 액세스 할 수있게하려고합니다. 그러나 어떻게 이해할 수 있습니까? 세션을 사용할 수 있습니까? 어떻게,이 경우에?

+0

은'login_required' 데코레이터가 작동되지 않습니다, 당신은 당신의 CreateView의 디스패치 메소드를 오버라이드 (override) 할 수 그렇다면 request.SESSION

: 나는 당신을 참조하여 사용자 로그인에 액세스 할 수 있으리라 믿고있어? –

+0

Nope. 그렇지 않습니다. –

답변

0

login_required 데코레이터를 가져 와서 뷰의 앞쪽에 @login_reqired를 넣어야합니다. 로그인 때보이보기 의지는 accesable 수

예 :.

우리는 사용자 로그인 여부 확인이나 mixin을 작성해야
from django.contrib.auth.decorators import login_required 
    @login_required 
    #put your view here 
+0

@login_required를 시도했습니다. 작동하지 않습니다. –

+0

view.py 또는 url.py의보기 바로 앞에서 사용 했습니까? –

+1

나는 이것을 사용했고 효과가 있었다. @method_decorator (login_required) def dispatch (self, * args, ** kwargs) : return super (AchievementCreate, self) .dispatch (* args, ** kwargs) –

0

.

장고 1.9은 LoginRequiredMixin를 도입 :

from django.contrib.auth.mixins import LoginRequiredMixin 

class UserProfile(LoginRequiredMixin, View): 
    login_url = '/login/' 

다음 코드는 사용자가 활성 또는 비활성 확인하는 믹스 인 정의이다. 사용자가 비활성 상태이면 세션을 로그 아웃합니다. 우리가보기에 유지 mixin을 mixins.py 같은 별도의 파일에 유지 mixin 쓰기 가져와야 Views.py에서

class UserMixin(object): 
    def dispatch(self, request, *args, **kwargs): 
     user = self.request.user 
     if user: 
      if user.is_active: 
       return super(UserMixin, self).dispatch(request, *args, **kwargs) 
      else: 
       logout(self.request) 
     return HttpResponseRedirect(reverse('cv:home')) 

from mixins.py import UserMixin 

class UserEdit(UserMixin, View): 
    model = UserProfile 
    template_name = "dashboard/edit_user.html" 
0

그래서 당신은 당신의 로그인 시스템을위한 '사회 인증'을 사용하는 . 귀하의 경우에는 사용자 정의 함수를 사용해야합니다.

class AchievementCreate(CreateView): 
    ..... 
    ..... 
    def dispatch(self, request, *args, **kwargs): 
     user = request.session['_auth_user_id'] 
     # handle authentication 
관련 문제