django框架中 用户登录post请求 跳转源地址的方法

两种方式实现用户登录后网页跳转至源地址

常见的网站需要实现登陆后自动跳转至源地址页面,在get请求中,可以通过获取Http中的referer地址实现;而在post请求中则无法直接通过获取的地址进行跳转。下面介绍两种在Django框架中实现post请求跳转源地址网页的方式。

首先看一下get请求中,跳转回源地址的代码段
# 服务器端处理登录请求的函数
def login_views(request):
    # get请求下的具体执行代码
    if request.method == 'GET':
        #  django中利用request.META.get('HTTP_REFERER')方法获取来源地址,如果不存在源地址,则取'/'
        refurl = request.META.get('HTTP_REFERER','/')
        print('refurl1=',refurl)
        # 判断session中是否存在uid和uphone
        if 'uid' in request.session and 'uphone' in request.session:
            return redirect(refurl)
        else:
            # 判断cookie中是否有uid 和uphone,如有,取出来保存进session
            if 'uid' in request.COOKIES and 'uphone' in request.COOKIES:
                request.session['uid'] = request.COOKIES.get('uid')
                request.session['uphone'] = request.COOKIES.get('uphone')
                # if data:
                return redirect(refurl)
            else:
                form = LoginForm()
                return render(request,'login.html',locals())
    else:
        # 处理post请求
        pass
post请求中不能直接获取源地址
def login_views(request):
    if request.method == 'GET':
        pass
    else:
        # post请求
        # 接收uphone和upwd
        uphone = request.POST.get('uphone')
        upwd = request.POST.get('upwd')
        
        # 获取源地址 
        refurl = request.META.get('HTTP_REFERER','/') 
        print('refurl2=',refurl)
        ..............
        return redirect(refurl)
           

post请求中获取的源地址是自身的地址,代码执行后,终端会显示如下:
在这里插入图片描述
此处的post请求提交后获得的源地址refurl是当前的登录地址,在此处会形成死循环,无法跳转目标页面(目标页面是get请求之前的源地址)

解决方案1:创建临时cookie值

未解决上面的问题,可以考虑在get请求中,将源地址临时存入cookie中,在post请求获取cookie中的源地址refurl后,删除cookie中的源地址。代码如下:

def login_views(request):
    if request.method == 'GET':
        XXXXXXXXXXXXXXXXXXXXXX
        else:
            # 将refurl保存进cookies,以便post请求取用
            # 先构建响应对象,然后将cookies保存进响应对象中
            form = LoginForm()
            resp = render(request,'login.html',locals())
            resp.set_cookie('refurl',refurl)
            return resp

post请求中,从cookies中获取源地址refurl

def login_views(request):
    if request.method == 'GET':
        pass
    else:
        XXXXXXXXXXXXXXXXXX
        if users:
            XXXXXXXXXXXXXXXXXXX
            # 从cookie中获取refurl
            refurl = request.COOKIES.get('refurl','/')
            resp = redirect(refurl)
            # 删除cookies中的refurl
            resp.delete_cookie('refurl')
            XXXXXXXXXXXXXXXXXXXX
            return resp
        else:
            # 登录失败,重定向回首页
            return redirect('/login/')
解决方案1:将源地址保存为全局变量

除去创建临时cookies的方法,还可以将get请求中获取的源地址保存为全局变量,源地址只能在get请求中修改,但可以在post请求中被引用。代码如下:

get请求代码
def login_views(request):
    if request.method == 'GET':
        global refurl
        refurl = request.META.get('HTTP_REFERER','/')
        print('refurl1=',refurl)
        XXXXXXXXXXXXXX
    else:
        pass
post请求代码
def login_views(request):
    if request.method == 'GET':
        pass
    else:
        # post请求代码段
        XXXXXXXXXXX
        # 判断登录是否成功
        if users:
            XXXXXXXXXXXX
            # 判断是否记住密码,如需记住,session存入cookies中
            if 'isSaved' in request.POST:
                expires = 60*60*24*365
                resp.set_cookie('uid', id, expires)
                resp.set_cookie('uphone', uphone, expires)
            # 源地址refurl为全局变量,可以直接重定向
            return redirect(refurl)
        else:
            # 登录失败,重定向回首页
            return redirect('/login/')

两种方法都可以实现在post请求中重定向回到get请求之前的源地址,具体采用哪种方式,可以根据具体的项目要求选择。

猜你喜欢

转载自blog.csdn.net/weixin_43409302/article/details/84323967