Flask(2):登陆验证

装饰器补充:

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")
        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()

原文地址:https://www.cnblogs.com/neozheng/p/9775887.html

时间: 2024-10-13 23:49:55

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

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

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

java web程序 登陆验证页面 4个页面人性化设置

到这里,快期末考试了,老师不讲课,我心里有苦不想说,也许没有考虑到老师的感受,让老师难堪了 但是我的行为已不再是我可以做的了.不可能了,我只是职业性的机械的做事了. 思路: 1.第一个是form表单,用户输入用户名和密码,点击登陆按钮 a.jsp 2.第二是验证页面,如果不是那个用户名和密码,则显示登陆失败或错误,点击链接重新登陆ok.jsp d.jsp 3.当用户为输入任何数据,即为空的时候,则提示用户先登录,c.jsp 第一个页面,就不写了 验证页面 ok.jsp ? 1 2 3 4 5 6

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

一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算.将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符.最终16Byte就能够转换成为32个字符. 1 package com.kdyzm.utils;

django简单用户登陆验证

一.django简单用户登陆验证   前端页面:     <div class="container  col-lg-6  col-lg-offset-4">         <br><br><br><br><br>       <form class="form-signin col-sm-4 col-lg-offset-2" action="{% url 'login' %}

asp.net 在AcquireRequestState事件中判断登陆验证。

Global中添加AcquireRequestState事件. protected void Application_AcquireRequestState(object sender, EventArgs e) { Uri url = Request.Url; //得到当前请求的URL //访问Admin目录,需要进行登陆验证. if (url.AbsolutePath.ToLower().StartsWith("/admin")) { //如果Login.aspx写在admin目录

数据库查询的一般写法:从登陆验证小案例中得到的一些启示和经验

这几天做了一个登陆验证的案例,主要功能就是:用户输入密码进行登陆,如果输错密码三次则15分钟内不能登陆. 这个案例确实不复杂,但是其中的逻辑第一次理解确实很别扭. 从这个小案例中,我得到了几个启示,并打算以后写类似的程序都执行此标准 1.该项目中,和sql有关的操作统统放到SqlHelper中 ---所有相同的操作都应该单独定义成一个助手类. 2.该项目中,使用了参数化查询有效防止了sql注入漏洞 ---所有关于查询的并且值由用户输入的sql语句,一律不准用字符串拼接 3.该项目中,判断用户是否

MVC用户登陆验证及权限检查(Form认证)

1.配置Web.conf,使用Form认证方式 <system.web> <authentication mode="None" /> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> <authentication mode="

Shrio登陆验证实例详细解读

摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+tomcat7. 这里主要说了Shiro的搭建过程,Spring+SpringMVC+Mybatis的搭建过可以看这里Spring+Mybatis+SpringMVC+Maven+MySql搭建实例 整个工程免费下载: 最终效果如下: 工程整体的目录如下: java代码如下: 配置文件如下: 页面资源如

登陆验证前对用户名和密码加密之后传输数据---base64加密

以下这种方法是加密传输的简单实现 1,base64.js /** * * Base64 encode / decode * * */ function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // public method for encoding this.encode = function (input

如何更改SQL Server 2008 登陆验证方式

配置SQL Server的身份验证方式 在 默认情况下,SQL Server 2005 Express是采用集成的Windows安全验证且禁用了sa登录名.为了工作组环境下不使用不方便的 Windows集成安全验证,我们要启用SQL Server 2005 Express的混合安全验证,也就是说由SQL Server来验证用户而不 是由Windows来验证用户. 1.使用SQL Server Management Studio Express. 当 我们启动SQL Server Manageme