装饰器补充:

import functools

def auth(func):
@functools.wraps(func) # 作用:把原函数的原信息封装到 inner 中
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
return ret
return inner @auth
def index():
print("index") # function.__name__ # 获取函数名
print(index.__name__) # 没加 functools.wraps 这个装饰器的时候, index.__name__ 是 "inner";加了 functools.wraps 之后,index.__name__ 就是 "index"

登陆认证:

登陆认证:某些页面只有登陆之后才能访问

# 方式一:
# 在需要登陆认证的视图函数中加上以下验证代码:
if not session.get("user"): # 获取 session
return redirect("/login")
# 该方式的缺点:假如需要认证的视图特别多,则需要在每个视图中添加上述代码 # 方式二:
# 利用自定义装饰器
def auth(func):
def inner(*args,**kwargs):
# 先判断是否已经登陆过
if not session.get("user"): # 获取 session
return redirect("/login")
func(*args,**kwargs)
return inner
# 然后给需要认证的视图加上上述装饰器 # 方式三:
# 利用 before_request 装饰器
@app.before_request
def auth():
# 如果是 "/login" 登陆路径,则让其继续走下面的视图函数
if request.path == "/login": # request.path :获取路径
return None
if session.get("user"): # 获取 session
return None
return redirect("/login")
# @app.before_request # 装饰器(需要导入)作用:before_request 装饰的函数 在所有视图函数执行之前 都会先被执行;如果遇到了 return xxx,后面的视图函数就不会再走,遇到 return None 则会继续走下面的视图函数(就像是 Django 中间件 process_request 中的 return 一样)

方式二的示例代码:

settings.py

class DevelopmentConfig(object):
SECRET_KEY = "vnasioeyh" # session相关(加盐加密)

login_verification.py

from flask import Flask, request, render_template, redirect, session
import functools app = Flask(__name__)
app.config.from_object("settings.DevelopmentConfig") # 设置配置文件:settings.py 文件中的 DevelopmentConfig 这个类 def auth(func):
@functools.wraps(
func) # 加上该装饰器的原因:以 index() 为例,经 auth 装饰过的 index函数 是 inner,然后 inner函数和"/index"这个路径绑定, 假如有好多视图函数都加上了这个装饰器,那么 inner 函数就会和好多路径绑定, Flask就不知道你绑定的是哪一个
def inner(*args, **kwargs):
# 先判断是否已经登陆过
if not session.get("user"): # 获取 session
return redirect("/login")
return func(*args, **kwargs) return inner @app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template("login.html") username = request.form.get("username")
password = request.form.get("psw")
if username == "neo" and password == "abc123":
session["user"] = username # 设置 session
return redirect("/index")
else:
return render_template("login.html", error="用户名密码错误") # 传递参数也可用字典 @app.route("/index")
@auth # 登陆认证的装饰器应该写在 app.route() 下面,这样 被 auth() 装饰后的 index() 函数能够作为一个整体(即 inner函数) 再被 app.route() 去装饰,即 被 auth() 装饰的 index() 这个整体,经过 app.route("/index") 装饰后 与 "/index" 这个路径 绑定
def index():
# 登陆之后才能访问 index 页面
return render_template("index.txt") # 模板后缀不影 if __name__ == "__main__":
app.run()
# 当好多视图都需要某一个装饰器的时候(如 登陆认证),就可以利用 @app.before_request 来进行相应的逻辑

Flask(2):登陆验证的更多相关文章

  1. flask笔记(三)Flask 添加登陆验证装饰器报错,及解析

    Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...

  2. flask之flask-login登陆验证(一)

    这个模块能帮助我们做很多事,最常用到的是,登陆验证(验证当前用户是否已经登陆).记住我功能 一 安装 pip install flask-login 二 导入相关模块及对象并初始化 from flas ...

  3. Flask 实现登陆 + session

    Flask 实现登陆 + session 案例一: # -*- coding: utf-8 -*- # @Time : 2019/9/24 16:26 # @Author : AnWen from f ...

  4. 【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

    一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需 ...

  5. ASP.NET MVC 自己实现登陆验证过滤器

    1.首先添加一个过滤器类,并实现接口中对应的方法 public class YLFAuthorizeAttribute : FilterAttribute, IAuthorizationFilter ...

  6. python学习 登陆验证

    #!/usr/bin/env python #-*- coding=utf-8 -*- #----------------导入模块------------------------------ impo ...

  7. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

  8. 【Java EE 学习 20】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】

    一.使用过滤器实现登录验证.权限认证 1.创建5张表 /*使用过滤器实现权限过滤功能*/ /**创建数据库*/ DROP DATABASE day20; CREATE DATABASE day20; ...

  9. springaop实现登陆验证

    1.首先配置好springmvc和springaop 2.先写好登陆方法,通过注解写代理方法 通过代理获得登陆方法的参数方法名,然后再aop代理方法内进行登陆验证 贴出代码 package com.h ...

  10. angularjs中$http、$location、$watch及双向数据绑定学习实现简单登陆验证

    使用$http.$location.$watch及双向数据绑定等实现简单的用户登陆验证,记录备忘: 1.$http模拟从后台获取json格式的数据: 2.$watch实时监控数据变化: 3.$loca ...

随机推荐

  1. 【小程序】基于.NET CORE2.1 的 微信开放平台 第三方平台开发 教程一 准备工作

    微信第三方平台概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认 ...

  2. C#DataTable学习心得[转]

    一.DataSet.DataTable.DataRow.DataColumn 1] 在DataSet中添加DataTable DataSet.Tables.Add(DataTable) 实例: Dat ...

  3. 228 Summary Ranges 汇总区间

    给定一个无重复元素的有序整数数组,返回数组中区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7]输出: ["0->2","4->5",& ...

  4. 简单工厂模式及php实现

    简单工厂模式(Simple Factory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类 ...

  5. ES之事件绑定,解除绑定以及事件冒泡、事件捕获

    绑定事件的处理方法任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接. ①句柄事件dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件兼容性非常好,但是 ...

  6. idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法

    https://youtrack.jetbrains.com/issue/IDEA-161094

  7. InChatter系统之本地化

    InChatter现在支持本地化了,其实这个只是很细节的东西,但是咱也是可以走走国际范.哈哈 其实最重要的原因只是想进行一次本地化的开发.这个概念相信大部分人都有,但是在实际项目中真的很少会涉及到,我 ...

  8. Python之三元运算、集合、函数

    一.三元运算符 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值 格式:[on_true] if [expression] else [on_false] res = 值1 if 条件 els ...

  9. D1. Toy Train (Simplified)

    D1. Toy Train (Simplified) time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  10. hdfs深入:02、今日课程内容大纲以及hdfs的基本实现

    1.hadoop第三天课程内容 hdfs:分布式文件存储系统hdfs的架构图hdfs的副本机制以及block块hdfs的元数据信息fsimage与editshdfs的文件读写过程hdfs的javaAP ...