使用Django和Flask获取访问来源referrer

Flask

request.referrer  # 来路
request.headers.get('User-Agent')  # 请求头

Django

request.META['HTTP_REFERER']  # 来路
request.META.get("HTTP_USER_AGENT")  # 请求头

补充:flask 重定向到上一个页面,referrer、next参数 --

>重定向会上一个页面

在某些场景下,我们需要在用户访问某个url后重定向会上一个页面,比如用户点击某个需要登录才能访问的连接,这时程序会重定向到登录页面,当用户登录后比较合理的行为是重定向到用户登录前浏览的页面。

下面的例中,在foo和bar视图中生成连接,链接过去后,没有重定向会上一个页面

@app.route('/foo')
def foo():
return '<h1>Foo page </h1><a href="%s" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Do something</a>' %url_for('do_something')
@app.route('/bar')
def bar():
return '<h1>Bar page</h1><a href="%s" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Do something </a>' % url_for('do_something')
@app.route('/do_something')
def do_something():
return redirect(url_for('hello'))
@app.route('/hello')
def hello():
name = request.args.get('name')
if name is None:
name = request.cookies.get('name','xiaxiaoxu')#从cookie中获取name值
response = '<h1>Hello, %s</h1>' % name
return response
if __name__ == '__main__':
app.run(debug = True)

结果:

访问127.0.0.1:5000/foo或者127.0.0.1:5000/bar后,页面出现连接,点击链接后,进入hello页面,之后停留在了hello页面

点击链接后重定向到了hello页面

我们的目的是在链接后,返回原来的页面

重定向会上一个页面,关键是获取上一个页面的URL。

获取上一个页面的URL有两种方法:

HTTP referrer

HTTP referrer是一个用来记录请求发源地址的HTTP首部字段(HTTP_REFERER),即访问来源。当用户在某个站点点击链接,浏览器想新链接所在的服务器发起请求,请求的数据中包含的HTTP_REFERER字段记录了用户所在的原站点URL。

在flask中,referer的值可以通过请求对象的referrer属性获取,即request.referrer

修改do_something视图函数:

@app.route('/do_something')
def do_something():
return redirect(request.referrer)

在bar页面上再次点击链接

有的时候,referrer字段可能是空值,比如用户直接在浏览器地址栏输入URL或者因为防火墙或者浏览器设置自动清除或修改referer字段,我们需要添加一个备选项:

return redirect(request.referrer or url_for('hello'))

查询参数next

除了自动从referrer获取,另一种更常见的方式是在URL中手动加入包含当前页面URL的查询参数,这个查询参数一般命名为next

在bar视图中的链接do_something对应的视图添加next参数(在/do_someghing后加参数)

def bar():
#print dir(request)
print "request.full_path:",request.full_path
#print "request.url:",request.url
return '<h1>Bar page</h1><a href="%s" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Do something and redirect </a>' % url_for('do_something', next = request.full_path)
@app.route('/do_something')
def do_something():
return redirect(request.args.get('next'))

为了避免next参数为空的情况,也可以加备选项,如果为空就重定向到hello视图

return redirect(request.args.get('next', url_for('hello')))

为了覆盖更全面,可以将查询参数next和referrer两种方式结合起来使用:

先获取next参数,如果为空就尝试获取referer,如果仍然为空,就重定向到默认的hello视图

因为在不同视图执行这部分操作的代码相同,我们可以创建一个通用的函数redirect_back()函数

在do_something视图中调用这个函数

@app.route('/bar')
def bar():
print "request.full_path:",request.full_path
return '<h1>Bar page</h1><a href="%s" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Do something and redirect </a>' % url_for('do_something', next = request.full_path)
def redirect_back(default = 'hello',**kwargs):
for target in request.args.get('next'),request.referrer:
if target:
return redirect(target)
return redirect(url_for(default,**kwargs))
@app.route('/do_something_and_redirect')
def do_something():
return redirect_back()
if __name__ == '__main__':
app.run(debug = True)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • django和flask哪个值得研究学习

    对于初学者来说,找到一个好的框架来学习或者项目开发都是非常有必要的,而当你有一定开发经验后,你应该选择适合当前业务需要的框架.我这里并不想探讨哪个框架好哪个不好,这个永恒的话题就跟探讨"世界上哪种编程语言最屌"是一样的. 分析 面对一个项目需求,不要着急去开发,学会控制开发成本的前提是明白技术难点可能带来的额外的时间消耗.对于我这种中级Python开发人员来说,并没有实质上的项目经验,没有开发过大型的线上项目,无非是爬虫写了一堆又一堆,本质上跟初学者差别不大,充其量也就算一个编码经验丰

  • Flask和Django框架中自定义模型类的表名、父类相关问题分析

    本文实例分析了Flask和Django框架中自定义模型类的表名.父类相关问题.分享给大家供大家参考,具体如下: 一. Flask和Django中定义表名(执行迁移后生成)的方式和flask是不同的: 1. Django中表名的定义方式,以代码为例说明 class User(AbstractUser): # 继承自认证系统模型类 """用户模型类""" mobile = modles.CharField(max_length=11, mix_len

  • Django和Flask框架优缺点对比

    Flask 在 Django 之后发布,现阶段有大量的插件和扩展满足不同需要 Django发布于2005年,Flask创始于2010年年中. Django功能大而全,Flask只包含基本的配置, Django的一站式解决的思路,能让开发者不用在开发之前不用花费大量时间在选择应用的基础设施. Django有模板,表单,路由,认证,基本的数据库管理等等内建功能.与之相反,Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩

  • Python web框架(django,flask)实现mysql数据库读写分离的示例

    读写分离,顾名思义,我们可以把读和写两个操作分开,减轻数据的访问压力,解决高并发的问题. 那么我们今天就Python两大框架来做这个读写分离的操作. 1.Django框架实现读写分离 Django做读写分离非常的简单,直接在settings.py中把从机加入到数据库的配置文件中就可以了. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', # 主服务器的运行ip 'PORT':

  • flask/django 动态查询表结构相同表名不同数据的Model实现方法

    1.问题 为了控制数据的增长,经常需要分表,数据库中存在多张结构相同,表名相关的表,如: table_201706 table_201707 table_201708 怎么通过SQLAlchemy 或者django查询相关的数据表,而不用每次都创建Model呢 2.解决方法 分别在flask和django下实现,代码如下 2.1 flask+sqlalchemy # -*-coding:utf-8 class NewDynamicModel(object): """ 动态产生

  • 在 Django/Flask 开发服务器上使用 HTTPS

    使用 Django 或 Flask 这种框架开发 web app 的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署.问题是这些内建服务器通常都不支持 HTTPS,我们想在开发的时候就能够使用和测试 HTTPS,不想还没测试就部署到生产环境,所以我们需要内建服务器能支持 HTTPS. 这个问题可以通过一个外部程序 stunnel 来解决,stunnel 的作用是通过 OpenSSL 库对 TCP 会话进行加密,建立起一个安全通道,保护没有加密功能或未加密的程序.其主要功能

  • 查看Django和flask版本的方法

    查看Django版本 检查是否安装成功,可以在dos下查看Django版本. 1.输入python 2.输入import django 3.输入django.get_version() 查看flask版本 检查是否安装成功,可以在dos下查看flask版本. 1.输入python 2.输入import flask 3.输入flask.__version__ 以上这篇查看Django和flask版本的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)

    测了一下django.flask.bottle.tornado 框架本身最简单的性能.对django的性能完全无语了. django.flask.bottle 均使用gunicorn+gevent启动,单进程,并且关闭DEBUG,请求均只返回一个字符串ok. tornado直接自己启动,其他内容一致. 测试软件为 siege,测试os为cenos6 64位,测试命令为: 复制代码 代码如下: siege -c 100 -r 100 -b http://127.0.0.1:5000/ django

  • 使用Django和Flask获取访问来源referrer

    Flask request.referrer # 来路 request.headers.get('User-Agent') # 请求头 Django request.META['HTTP_REFERER'] # 来路 request.META.get("HTTP_USER_AGENT") # 请求头 补充:flask 重定向到上一个页面,referrer.next参数 -- >重定向会上一个页面 在某些场景下,我们需要在用户访问某个url后重定向会上一个页面,比如用户点击某个需要

  • django 使用 request 获取浏览器发送的参数示例代码

    获取数据(四种方式) 1. url: 需要正则去匹配 url(r'^index/(num)/$',view.index) 匹配到的参数会自动传入对应的视图函数 也可以给匹配到的参数起名字?P<num>     url(r'^index/(?P<num1>\d*)(?P<num2>\w*)$',) 使用url传参的时候,要么都使用位置参数,要么都使用给参数起名字的方式 也可以通过request.path获取到url然后获取相应的参数. 如访问127.0.0.1:8000/

  • Python常用Web框架Django、Flask与Tornado介绍

    web框架是什么? web开发框架是一组工具,同时也提供了非常多的资源,供软件开发人员构建和管理网站.提供web服务.编写web应用程序.它是一个抽象工具,能使开发应用程序和重复使用代码的过程变得更容易. 为什么需要web开发框架? 进行自定义软件开发时,web开发框架让整个过程变得更容易,因而开发速度更快.更高效.许多开发框架都很便宜,这也使得整个客户机的成本更小. 一个被广泛使用的框架安全性更高.这主要依赖于该框架背后的社区,在这里,用户成为长期的测试人员,并可以提供修复. 如果发现了安全漏

  • C#判断访问来源是否为搜索引擎链接的方法

    本文实例讲述了C#判断访问来源是否为搜索引擎链接的方法.分享给大家供大家参考.具体分析如下: 这段代码通过获取UrlReferrer判断访客是否来自常用的搜索引擎,不是完全准确,可做参考 /// 判断是否来自搜索引擎链接 /// 是否来自搜索引擎链接 public static bool IsSearchEnginesGet() { if (HttpContext.Current.Request.UrlReferrer == null) { return false; } string[] Se

  • PHP自定义函数获取搜索引擎来源关键字的方法

    本文实例讲述了PHP自定义函数获取搜索引擎来源关键字的方法.分享给大家供大家参考,具体如下: 获取搜索引擎来源关键字的函数: function getKeywords() { // 搜索引擎关键字映射 static $host_keyword_map = array( 'www.baidu.com' => 'wd', 'v.baidu.com' => 'word', 'image.baidu.com' => 'word', 'news.baidu.com' => 'word', '

  • Django实现的自定义访问日志模块示例

    本文实例讲述了Django实现的自定义访问日志模块.分享给大家供大家参考,具体如下: 在Django默认没有访问日志模块,但是我们可以通过Django的Middleware来实现一个自己的访问日志模块. 首先在Django的工程下创建一个middleware.py文件,内容如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import time class AccessMiddleware(object): def process_request

  • python django 原生sql 获取数据的例子

    如下所示: node2:/django/mysite/blog#cat views.py 1, # -*- coding: utf-8 -*- from __future__ import unicode_literals # from django.shortcuts import render, render_to_response from .models import * # Create your views here. from django.http import HttpResp

  • PHP获取访问设备信息的方法示例

    本文实例讲述了PHP获取访问设备信息的方法.分享给大家供大家参考,具体如下: <?php header("Content:Content-type:text/html;charset=utf-8"); // // 作用取得客户端的ip.地理位置.浏览器.以及访问设备 class get_equipment_info{ ////获得访客浏览器类型 function GetBrowser(){ if(!empty($_SERVER['HTTP_USER_AGENT'])) { $br

随机推荐