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

常见的网站需要实现登陆后自动跳转至源地址页面,在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请求
post请求中不能直接获取源地址
def login_views(request):
    if request.method == 'GET':
    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':
    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:
post请求代码
def login_views(request):
    if request.method == 'GET':
    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请求之前的源地址,具体采用哪种方式,可以根据具体的项目要求选择。

问题:图书管理系统点击编辑之后跳转的不是当前编辑的页数, 而是跳转到了第一页去了,这对用户来说是体验很不好的, 编辑完成之后还要翻到那一页看一下有没有编辑成功,下面就来解决一下这个问题: 实现思路: 在get请求路劲加一个next参数,后端获取next参数的值进行跳转 <a href="{% url 'app02:edit_book' book_obj.nid %?next=/show_book/?page=2}">编辑</a> 后端代码: next_url = r..
一.Templates 当需要使用template模板页面时,Django不光会在当前app下查找Template文件夹下的模板文件,他会查找整个Django项目下的所有Template文件夹下的模板文件。 但如果两个不同app下有同名模板文件呢,为了避免这种情况: 在app下新建这样一段目录,将HTML文件都存放在此处,这样就不会出现查错的情况了 补充一下我们创建的这个html,改名成index.html吧,因为之前的view跳转就是跳的index <!DOCTYPE html> 客户端/服务端软件,即客户端要自己下载,安装之后才能访问服务端,服务端为开发的服务器。 B/S结构软件: 浏览器/服务端软件,即客户端不需要自己下载,客户只需要在电脑上用浏览器访问客户端即可访问服务端。 一般的web框架都是B/S结构软件,在浏览器上输入http://www.127.0.0.1/(默认端口8000)即可...
django-admin startproject 项目名称 python manage.py startapp 应用app名 2.Django创建项目后,项目文件夹下的组成部分 此题考的是学员对MVT 的理解 项目文件夹下的组成部分: manage.py 是项目运行的入口,指定配置文件路径。与项目同名的目录,包含项目的配置文件。 init.py ... 一个软件是由其各个软件模块组成的,每一个模块都有特定的功能,模块与模块之间通过相互配合来完成软件的开发。 软件框架是针对某一类软件设计问题而产生的 Django遵循的是MVC思想 MVC框架 MVC的产生理念:分工,让专门的人去做专门的事情(比如:输入、处理、输出) MVC的核心思想:解耦 MVC是三个模块的简称: M:model,模型,和数据库进行交互 V:View,视图,...
想要实现一个简单的点击并且跳转到另外的界面,对于一个Java开发人员或者前端人员来说简单无比,可以对于Django,我却无能为力,谢特!为了想偷懒不看教程直接头铁去搞,结果搞了六七个小时,还是在小伙伴的帮助下实现的,感谢小政政~那么到底怎么实现 点击其的一个按钮,就执行跳转到另外一个界面呢? 如果你是一个完全的django小白跟我一样,那你至少要搞懂settings.py, urls.py和v...
templates模板 filter过滤器safe可讲html富文本进行渲染 <p>{{ one_article.content|safe }}</p>2. 添加富文本编辑器<head> <script src="/static/plugins/ckeditor/ckeditor.js"></script> </head> <textarea i
首先创建项目创建APP与前后端未分离时是一样的,参考第一步第二步即可:https://blog.csdn.net/weixin_43844071/article/details/105363442 1.设置链接的数据库、注册APP 在项目的settings.py文件修改DATABASS和INSTALLED_APPS的值 # 连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',