2012-03-05 4 views
0
내 웹 사이트에 모든 곳에서 로그인 폼을 넣을

, 나는 이런 내 자신의 미들웨어를 쓰기로 결정 몇 SO 답변을 다음과 후 :장고 미들웨어 문제

import django.conf.global_settings as DEFAULT_SETTINGS 
... 
MIDDLEWARE_CLASSES = DEFAULT_SETTINGS.MIDDLEWARE_CLASSES + (
    'base.mymiddleware.LoginFormMiddleware', 
) 
TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request', 
) 

형태는, 모든 곳에서 accesed 할 base.html에서, 다음과 같습니다

{% if user.is_authenticated %} 
      <div class="login_box"> 
       <form action="/myapp/logout/" method="post">{% csrf_token %} 
        <div class="col2"><a>{{ user.username }}</a></div> 
        <div class="col3"><input type="submit" value="Logout" name="logout_submit"/></div> 
       </form> 
      </div> 
     {% else %} 
       <form action="." method="post"> 
        {% csrf_token %} 
        <div class="login_box"> 
         <div class="error_box"> 
          {% if request.login_form.errors %} 
           Incorrect User/Password 
          {% endif %} 
         </div> 
         <div class="col00"> <h4>{{ request.login_form.username.label_tag }}</h3></div> 
         <div class="col11">{{ request.login_form.username }}</div> 
         <div class="col22"><h4>{{ request.login_form.password.label_tag }}</h3></div> 
         <div class="col33">{{ request.login_form.password }}</div> 
         <div class="col44"><input type="submit" value="Login" name="login_submit"/></div> 
         <input type="hidden" name="next" value="{{ request.get_full_path }}" /> 
        </div> 
       </form> 
     {% endif %} 

로그인 normall 작동 y를하지만, 그것을하고 나면 GET 요청을 할 때마다 user.is_authenticated가 false를 반환하는 것처럼 보입니다. 로그 아웃 폼 대신 빈 로그인 폼이 표시됩니다.

문제가 내 미들웨어에있는 경우 (request.method! = 'POST'가 양식 = LoginForm (request)를 반환하는 경우) 또는 내 설정에서 누락 된 항목이거나이 경우 미들웨어를 사용하는 것일 수 있습니다. 좋은 생각이 아니 었습니다. ...

+0

관련된 뷰를 추가하십시오. 나는 개인적으로이 상황에서 미들웨어를 사용하는 목적을 이해하지 못했다. 장고는 로그인과 체크 아웃을위한 알맞은 모듈을 제공한다. –

+0

내 견해는 미안하지만 모든 작업이 미들웨어에 있다는 사실을 알지 못합니다. 실제로 그 안에 장고 로그인을 사용하고 있습니다. 로그인 및 로그 아웃보기에는 다음 행이 있습니다. return HttpResponseRedirect (request.META.get ('HTTP_REFERER')). 미들웨어를 사용하는 것은 내가 HTML이 아닌, 내 사이트에서이 양식을 원하기 때문이다. – juankysmith

+0

Django의 인증 미들웨어는 템플릿 상속을 사용하고 있다면'dict'에'user '객체를 템플릿에 추가한다. (해야한다) _, 당신은 모든 페이지에로드됩니다 이런 식으로 base.html에 양식을 넣을 수 –

답변

1

미들웨어에 이런 종류의 논리를 두는 것을지지하는 응답을 보지 못했습니다. (있다면, 내가 그들을 downvote 수있는 링크를 게시하십시오.)

이것은 정말로, 정말, 이런 일을 할 장소가 아닙니다. 특정보기를 작성하고 로그인 양식의 조치 매개 변수를 해당보기로 설정하십시오.

그러나 사용자 객체가 템플릿에 전달되지 않도록 다른 뷰를 렌더링하기 위해 RequestContext를 사용하지 않는다고 생각합니다.

+0

http://stackoverflow.com/questions/2734055/putting-a-django-login-form-on-every-page – juankysmith

+0

@juankysmith 그래서 우리는'@ login_required' 데코레이터 –

+0

을 알고 있습니다. 내 무지를 안타깝게 생각합니다. 하지만 모든보기 후에 데코레이터와 폼을 표시한다는 사실 사이의 관계를 볼 수는 없습니다. – juankysmith

0

구현은별로 의미가 없습니다. 조치 속성이있는 로그인 양식은 "."입니다. 잘못되어 갈등을 초래할 수 있습니다.

로그인 보기이 아니고 로그인 미들웨어이 있어야합니다. 로그인 양식의 작업 속성은 로그인보기의 역순으로 된 URL이어야합니다. 로그인 양식에서

, 당신은 예를 들어 다음 숨겨진 입력을 지정해야합니다 :

<input name="next" type="hidden" value="{{ request.POST.next|default:request.path }}" /> 

그 다음, 당신의 기본 템플릿에 있거나 어디서든 웹 사이트에서 할 수 있습니다.

로그 아웃시에도 유효합니다.

+0

그래서 ... 모든보기의 반환에 양식을 전달해야합니까 ?? – juankysmith

+0

왜 그렇게하고 싶습니까? 양식의 HTML을 붙여 넣기 만하면됩니다. 그것이 우리가 betspire.com에 가지고있는 것입니다. 간단하고 정숙합니다. – jpic

+0

예, 제가하고 싶은 것은 betspire와 같은 로그인입니다. 로그인을 위해보기를 사용합니까? – juankysmith