Django登陆以后重定向到请求登陆的页面

作者:半瓶墨水   链接:http://www.2maomao.com/blog/django-login-redirect/

登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面。

比如用户正在浏览一篇文章,发现下载该文章的附件需要登录才能进行,这时候点击登陆链接转入登陆页面,输入用户名密码登陆成功以后,会自动转回原来的那篇文章所在的页面。(目前很多网站采用ajax方法弹出对话框登陆,效果更好一些)

怎么做呢?下面说的是django的实现,但是大多数的web framework都可以这么做。

注销操作
因为不需要单独的注销页面,相对简单,利用HTTP_REFERER,Django的注销页面这样写就行:

def logout_user(request):
    
logout(request)
    
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

登录操作
登陆操作相对复杂,因为一般都有单独的登陆页面,如果登陆成功再取HTTP_REFERER就是登陆页面自己的url,而不是之前的那个页面。

可以利用django的session,在转入登陆的时候,用的是页面的get请求,这时候在session中记录HTTP_REFERER,用户输入用户名密码进行登陆的时候(Post请求),从session中取出即可:

def login_user(request):
    
if request.method == 'GET':
        
#记住来源的url,如果没有则设置为首页('/')
        
request.session['login_from'] = request.META.get('HTTP_REFERER', '/')
        
#TODO:显示登陆页面,blablabla
    
elif request.method == 'POST':
        
#TODO: 用户登录操作,blablabla
        
#重定向到来源的url
        
return HttpResponseRedirect(request.session['login_from'])

最后的重定向,有时候需要用户感觉到被重定向回去了,就写个简单的页面告诉用户两秒以后跳转,然后改改相应的login代码就行:

<p>两秒钟后转入如下链接,如果长时间没有响应请直接点击:</p>
<p><a href="{{ refresh_url }}">{{ refresh_url }}</a></p>
<meta http-equiv="refresh" content="2;url={{ refresh_url }}">

8 条评论 发表在“Django登陆以后重定向到请求登陆的页面”上

  1. 我烦!!!!说道:

    好歹写的清楚点啊。写的都什么??
    看不懂!!!
    烦死了!
    cao他妈的php!!
    真jb

  2. 半瓶墨水说道:

    @我烦
    日!
    上面写明白了是Django,还php…

  3. jack说道:

    很好!简单明了!

  4. 神怡说道:

    一楼真幽默

  5. jack2说道:

    @1楼
    编程语言有很多,不仅只有PHP

  6. Yan说道:

    1楼亮了!

  7. Randy说道:

    用session似乎不太靠谱的,比如你在多个页面打开某个站点的多个不同页面,这样的话就有点混乱了哦

  8. 半瓶墨水说道:

    @Randy

    对,你说的问题是存在,虽然我自己用的时候还没遇到这种情况,但可能有别人的使用习惯不一样,或许用隐藏的input更好一些。

留下回复