3

これは私のログインビューです:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))

login = never_cache(ログイン)

たとえば、example.com/myblog/ にアクセスすると、example.com/accounts/login/?next=/myblog/ にリダイレクトされます。

しかし、ログイン用にユーザーと psw を挿入すると、/myblog/ ではなく /blogs/ にリダイレクトされます。

なんで ?

編集: request.REQUEST.get('next', '') は常に '' を返します

どうしてか分かりません :-\

4

2 に答える 2

8

How does your login form template look like?

Your problem

You are not sending the redirect_to path to your template and you should. Your return should look like this:

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)

The login form action should look like this:

<form action="/your_login_url/?next={{ next }}" method="post">

So when you go to /myblog/ you get redirected to /your_login_url/?next=/myblog/, the login view then renders the login form and replaces the next variable in login form action attribute so it looks like /your_login_url/?next=/myblog/ and when you submit the form you get logged in and redirected to /myblog/ (stuff after if request.method == 'POST': gets executed).

In your view, redirect_to = request.REQUEST.get("next") works fine when you only GET the login page but when you POST to it there is not next variable set in GET.

Also note

Login view shouldn't render your blog, blogs view should do that.

This is how Django's returned response looks like, note the line where it says redirect_field_name: redirect_to,, redirect_field_name has the value of next by default.

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))

And, you seem to override the login view only for default redirection? This isn't right IMHO. The right place to set default location for login redirection is in your settings.py by setting LOGIN_REDIRECT_URL.

But, since you are writing your own login view why not use the one in django as a skeleton and then expand on it what you need.

于 2010-05-13T11:20:14.370 に答える
1

なぜなら

 not redirect_to or '//' in redirect_to or ' ' in redirect_to

True と評価されますか?


男に釣りを教えたら? http://docs.python.org/library/logging.html

これを一番上にして

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)

これをコード内の適切と思われる場所 (if ステートメントの後など) に配置します。

logging.debug("redirect_to = %s" % redirect_to)

実行して、「/tmp/logging_example.out」の内容を確認します

于 2010-05-13T09:24:59.967 に答える