一、session

除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。

  • 设置:session['username'] = 'xxx'
  • 取值:session.get['username']
  • 删除:session.pop('username', None)
from flask import Flask
from flask import render_template
from flask import session
from flask import request
from flask import redirect app = Flask(__name__) app.config.from_mapping({"SECRET_KEY":"value"}) @app.route("/login",methods=["GET","POST"])
def login():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if username == "xiaoming" and password == "":
# 登陆成功后设置session
session["userinfo"] = {"name":username}
return redirect("/")
return render_template("login.html") @app.route("/")
def index():
# 获取session
print(session["userinfo"])
return "首页" if __name__ == '__main__':
app.run()

二、flash 闪现

闪现的作用:flash设置值只能取一次

闪现的原理:利用session设置值,通过pop的方法删除并返回值,取值的时候调用session.pop()的方法将值放到flashes中,请求还在取值都从flashes中获取

'''
存一次只能取一次值,用session模拟闪现
'''
from flask import Flask,session app = Flask(__name__)
app.secret_key = "key" # 设置session需要设置secret_key @app.route("/set")
def set():
session['name'] = "xiaoming"
return "Set name" @app.route("/get")
def get():
# 删除session的键值对并取值
name = session.pop("name","")
print(name)
return name if __name__ == '__main__':
app.run()

session模拟flash

# 设置值
flash(message, category='message') # 获取值
get_flashed_messages(with_categories=False, category_filter=[])
from flask import Flask,flash,get_flashed_messages

app = Flask(__name__)
app.secret_key = "key" @app.route("/set")
def set():
flash("xiaoming") # 设置值
flash(18,"age") # 参数:message,分类
return "flash设置值" @app.route("/get")
def get():
# 取值
name = get_flashed_messages() # 按分类取值category_filter=[]
age = get_flashed_messages(category_filter=["age"])
print(name)
print(age)
return "GET" if __name__ == '__main__':
app.run()

三、中间件

app.run()        #程序的入口

run_simple(host, port, self, **options)        # run的本质是调用run_simple
# host == ip
# port == 端口
# self == app # 执行了self() 相当于执行app(),调用app的__call__方法
# app.__call__ def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response) # 相当于执行 app.wsgi_app(environ, start_response)

app.run的源码流程

'''
中间件的实现
''' from flask import Flask app = Flask(__name__) class Middleware(object):
def __init__(self,old_wsgi_app):
# 原来的wsgi_app
self.wsgi_app= old_wsgi_app def __call__(self, *args, **kwargs):
print("项目启动之前")
# wsgi_app是原来的wsgi_app
ret = self.wsgi_app(*args, **kwargs)
print("项目启动之后")
return ret if __name__ == '__main__':
# 将旧的app.wsgi_app赋值给新的app.wsgi_app
app.wsgi_app = Middleware(app.wsgi_app)
app.run() '''
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
项目启动之前
127.0.0.1 - - [28/Dec/2018 16:43:27] "GET / HTTP/1.1" 404 -
项目启动之后
'''

四、特殊的装饰器

@app.before_first_request # 第一次请求
@app.before_request # 每一次请求
@app.after_request # 每一次响应

注意:before_request有返回值,不走视图函数,直接走after_request
@app.template_global()
@app.template_filter()
@app.errorhandler(404)

'''
自定义装饰器实现登陆认证
''' from flask import Flask
from functools import wraps
from flask import url_for
from flask import session
from flask import render_template
from flask import request,redirect app = Flask(__name__)
app.secret_key = "key" # 自定义装饰器
def Auth_decorator(func):
@wraps(func)
def inner(*args,**kwargs):
# 访问是否携带认证,否则跳转都登陆页面
if not session.get("user",""):
return redirect("login")
ret = func(*args,**kwargs)
return ret
return inner # 登陆
@app.route("/login",endpoint="login",methods=["GET","POST"])
def login():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if username == "xiaoming" and password == "":
# 登陆成功后设置session
session["user"] = username
return redirect(url_for("myhome"))
return render_template("login.html") # 登陆成功后跳转的页面
@app.route("/home",endpoint="myhome")
@Auth_decorator
def home():
return "登陆成功的HOME页面" if __name__ == '__main__':
app.run()

自定义登陆认证的装饰器

# 模板的全局装饰器
@app.template_global()
def mysum(n1,n2):
return n1+n2 # HTML
{{ mysum(10,5) }}

@app.template_global()

# 模板的筛选器
@app.template_filter()
def myfilter(data):
return data[::2] # HTML
{{ "today hello" | myfilter() }}

模板的筛选器

# 路径不存在跳转到指定页面的装饰器
@app.errorhandler(404)
def error_page(error):
return render_template("error404.html")

路径不存在返回页面

五、路由的实现原理

不能有多个endpoint指向同一个视图函数,内部是{'endpoint':"view_func"}

app.route()
# 执行route函数
route(self, rule, **options)
# self == app
# rule == 路由 # 返回decorator函数
return decorator # decorator函数,传入视图函数
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f # 调用add_url_rule(路由,endpoint,视图函数)
def add_url_rule(self, rule, endpoint=None, view_func=None,provide_automatic_options=None, **options):
# endpoint不能有多个视图函数,否则抛出异常
if view_func is not None:
old_func = self.view_functions.get(endpoint)
if old_func is not None and old_func != view_func:
raise AssertionError('View function mapping is overwriting an '
'existing endpoint function: %s' % endpoint)
self.view_functions[endpoint] = view_func

route源码流程

'''
根据路由原理创建Flask项目
'''
from flask import Flask # 实例化Flask对象
app = Flask(__name__) def index():
return "这是首页" # 调用app.route的核心方法,实行app.route
app.add_url_rule("/",view_func=index) if __name__ == '__main__':
app.run()

六、CBV编程

1.类继承views.MethodView
2.装饰器修饰的列表 decorators = []
3.指定路由和类 app.add_url_rule

from flask import Flask
from flask import views app = Flask(__name__) class MyView(views.MethodView):
# decorators = [] # 存放装饰器的列表
# methods = ["GET","POST"] # 请求方式列表,用于限制的 def get(self):
return "GET" def post(self):
return "POST" app.add_url_rule("/",view_func=MyView.as_view(name="index")) if __name__ == '__main__':
app.run()

七、自定义路由正则匹配

from flask import Flask,url_for
from werkzeug.routing import BaseConverter app = Flask(__name__) class RegexConverter(BaseConverter):
'''
自定义URL匹配正则表达式
''' def __init__(self,map,regex):
super(RegexConverter,self).__init__(map)
self.regex = regex def to_python(self, value):
'''
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
'''
return value def to_url(self, value):
'''
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
'''
val = super(RegexConverter,self).to_url(value)
return val # 添加到flask中
app.url_map.converters['regex'] = RegexConverter @app.route("/index/<regex('\d+'):id>")
def index(id):
print(url_for('index',id=''))
print(type(id))
return "{}".format(id) if __name__ == '__main__':
app.run()

Flask的基础二的更多相关文章

  1. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

  2. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  3. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  4. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  5. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  6. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  7. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  8. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  9. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

随机推荐

  1. pytorch保证每次运行使用的随机数都相同的方法

    其实在代码的开头添加下面几句话即可: # 保证训练时获取的随机数都是一样的 init_seed = torch.manual_seed(init_seed) torch.cuda.manual_see ...

  2. Python数据库连接池DBUtils详解

    what's the DBUtils DBUtils 是一套用于管理数据库连接池的Python包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放.并允许对非线程安全的数据库 ...

  3. (转载) AutoML 与轻量模型大列表

    作者:guan-yuan 项目地址:awesome-AutoML-and-Lightweight-Models 博客地址:http://www.lib4dev.in/info/guan-yuan/aw ...

  4. preg_quote

    $p = 'http://'; $p = '/'.preg_quote($p, '/').'/'; echo $p; /http\:\/\//

  5. 容器版jenkins使用宿主机的docker命令

    参照里面的第一步里面的dockerfile: https://www.cnblogs.com/effortsing/p/10486960.html

  6. 【python基础】python开启GPU加速

    前言 训练时使用GPU可以加速程序运行,本文介绍如何使用GPU加速. 前提条件 1. 机子有GPU显卡,并安装GPU显卡驱动: 2. 安装GPU的使用环境,CUDA等: 3. 打开nvidia-smi ...

  7. 分布式唯一ID生成常用方案

    1. 使用JAVA的UUID生成 算法的核心思想是结合机器的网卡.当地时间.一个随记数来生成UUID. 优点:本地生成,生成简单,性能好,没有高可用风险 缺点:长度过长,字母和数字组合,存储冗余,且无 ...

  8. 面试之leetcode20堆栈-字符串括号匹配,队列实现栈

    1 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认 ...

  9. /x86_64-linux-gnu/libSM.so: undefined reference to `uuid_generate@UUID_1.0'错误

    在编译PCL的时候总是报错,其他人都没问题 后来发现是我cmakePCL的时候,QT引用的是anaconda里的qt,把这个一改果然没问题了,耽误了一天时间. 感谢stack上这位老铁

  10. 【转】SpringBoot处理url中的参数的注解

    1.介绍几种如何处理url中的参数的注解 @PathVaribale  获取url中的数据 @RequestParam  获取请求参数的值 @GetMapping  组合注解,是 @RequestMa ...