首页 > 其他分享 >登录认证装饰器,flask配置文件,路由系统

登录认证装饰器,flask配置文件,路由系统

时间:2023-08-01 15:23:11浏览次数:30  
标签:endpoint 函数 配置文件 flask app --- inner 装饰 路由

0 登录认证装饰器

# 0 装饰器的本质原理
	-# 类装饰器:1 装饰类的装饰器   2 类作为装饰器
# 1 装饰器使用位置,顺序
# 3 flask路由下加装饰器,一定要加endpoint
	-如果不指定endpoint,反向解析的名字都是函数名,不加装饰器没有问题,就是正常函数index,detail
    -如果加了装饰器---》index,detail都变成了inner---》反向解析的名字都是函数名inner,报错了
    -wrapper装饰器----》把它包的更像---》函数名变成了原来函数的函数名


def add(func):
    print(func)


# 类装饰器:1 装饰类的装饰器   2 类作为装饰器

# add 一定是个函数吗?
# 放个对象
class Person:
    def __call__(self, func):
        def inner(*args, **kwargs):

            res = func(*args, **kwargs)
            return res
        return inner

p = Person()

# @add  # test=add(test)--->test变成了None
@p  # test=p(test)  # p() 会触发__call__--->Person的 __call__(func)--->返回inner,以后test就是inner---》test(参数)--》执行的是inner
def test():
    print("test")

print(test)

def auth(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)  # 真正的执行视图函数,执行视图函数之,判断是否登录
        res.name='lqz'
        return res
    return inner

@auth     # Foo=auth(Foo)
class Foo():
    pass

f=Foo()  # Foo()  调用 ---》inner()--->类实例化得到对象,返回,以后f就是Foo的对象,但是可以里面多了属性或方法
print(f)
print(f.name)



### 有参装饰器--->额外为被装饰的函数传参数
@auth(10)     # Foo=auth(10)(Foo)
class Foo():
    pass

1 配置文件

#  django 有settings配置文件----》所有web框架都会有配置文件---》配置文件的形式可能不太一样

方式一
   app.config['DEBUG'] = True
   PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...)
方式二
    #通过py文件配置
    app.config.from_pyfile("python文件名称")
    如:
    settings.py
    DEBUG = True

    app.config.from_pyfile("settings.py")
方式三
    #通过环境变量配置
    app.config.from_envvar("环境变量名称")
    #app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS'])
方式四
	#环境变量的值为python文件名称名称,内部调用from_pyfile方法

    app.config.from_json("json文件名称")
    JSON文件名称,必须是json格式,因为内部会执行json.loads
 方式五
    字典格式
    app.config.from_mapping({'DEBUG': True})

方式六
    app.config.from_object("python类或类的路径")

    app.config.from_object('pro_flask.settings.TestingConfig')

    settings.py


    class Config(object):
        DEBUG = False
        TESTING = False
        DATABASE_URI = 'sqlite://:memory:'


    class ProductionConfig(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'


    class DevelopmentConfig(Config):
        DEBUG = True


    class TestingConfig(Config):
        TESTING = True


PS: 从sys.path中已经存在路径开始写

PS: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则就是instance_path目录(Flask对象init方法的参数)

2 路由系统

#  1  flask路由系统是基于装饰器的:参数如下
@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')
# 2 转换器:
# 3 路由系统本质
# 4 endpoint 不传会怎么样,不传会以视图函数的名字作为值,但是如果加了装饰器,所有视图函数名字都是inner,就会出错,使用wrapper装饰器再装饰装饰器
from flask import Flask

app = Flask(__name__)

# 1  flask路由系统是基于装饰器的:参数如下
# rule:路径
# methods :请求方式,列表
# endpoint: 路径别名


# 2 转换器:
'''  string  int  path
'default':          UnicodeConverter,
'string':           UnicodeConverter,
'any':              AnyConverter,
'path':             PathConverter,
'int':              IntegerConverter,
'float':            FloatConverter,
'uuid':             UUIDConverter,
'''

## 3 路由系统本质-->读源码
'''
def decorator(f: T_route) -> T_route:
    endpoint = options.pop("endpoint", None) #从options弹出,如果没有,就是None ---》@app.route(传了就有,不传就是None)
    self.add_url_rule(rule, endpoint, f, **options)
    return f  # f 就是视图函数,没有对视图函数做事情,只是在执行视图函数之前,加了点操作
    
    
核心:self.add_url_rule(rule, endpoint, f, **options)---》self就是app对象
app.add_url_rule('路由地址', '路由别名', 视图函数, **options)--->跟django很像

add_url_rule的参数详解
    rule, URL规则,路径地址
    view_func, 视图函数名称
    defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
    为函数提供参数
    endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
    methods = None, 允许的请求方式,如:["GET", "POST"]
    #对URL最后的 / 符号是否严格要求
    strict_slashes = None
    #重定向到指定地址
    redirect_to = None, 

'''

'''
4 endpoint 不传会怎么样,不传会以视图函数的名字作为值,但是如果加了装饰器,所有视图函数名字都是inner,就会出错,使用wrapper装饰器再装饰装饰器

'''


## 4


# @app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')
# @app.route('/<path:aa>', methods=['GET'])
@app.route('/', methods=['GET'])  # index=app.route('/<aa>', methods=['GET'])(index)--->index=decorator(index)
def index(name):
    print(name)
    return 'hello world'


def home():
    return 'home'


# app.add_url_rule('/', 'index', index,defaults={'name':'lqz'})
# app.add_url_rule('/home', 'home', home,strict_slashes=True,redirect_to = '/')

if __name__ == '__main__':
    app.run()

标签:endpoint,函数,配置文件,flask,app,---,inner,装饰,路由
From: https://www.cnblogs.com/liyuanxiangls/p/17596602.html

相关文章

  • 前端路由+原生JS实现SPA
    前端路由●路由:就是一一对应关系的集合●前端路由:就是一个url地址,对应哪个组件(页面)●前端路由的本质○根据地址栏变化(不重新想服务器发送请求),去局部更新不同的页面内容,完成前端业务场景切换●前端路由的思路○URL地址栏中的Hash值发生了变化○前端JS监听到H......
  • react路由6登录拦截
    自定义登录拦截组件://路由守卫//判断token是否存在,如果存在跳转页面,不存在返回登录页面import{Navigate}from'react-router-dom'constgetToken=()=>{returnsessionStorage.getItem("token")}functionAuthRouter({children}){//获取token......
  • react使用自定义animation实现水平效果的路由切换
    例如:A组件跳B组件 A组件:importReactfrom'react';import'./A.scss'import{useNavigate}from'react-router-dom';exportdefaultfunctionA(){letnavigate=useNavigate()return(<divonClick={()=>{l......
  • vue中使用provide和inject依赖注入组件之间进行父子组件传值(也适用于嵌套路由)
      父组件中:provide:function(){return{reload:this.reload//父组件中的方法}}子组件中:inject:['reload']使用:this.reload()//也可传入参数......
  • 路由工具
    ACL列表ACL访问控制列表,即用于流量的匹配与控制,但也能够用于匹配路由条目。前缀列表与AC的区别1)ACL无法匹配路由掩码2)ACL无法匹配精确的路由如:存在两个路由192.168.1.0/24,192.168.1.0/16如果用ACL只匹配192.168.1.0/16的话应该这么写:[AR1]acl2000[AR1-acl-basic-2000]rulepermit......
  • 搭建一个简单的HTTP API Service( python+flask )
    1背景学习HTTP接口相关知识,为了方便,在本地搭建了一个可用的API环境用于学习和测试2环境windows10python3.10Flask2.3.2主要接口逻辑测试post方法get方法服务端请求日志代码提交至giteehttps://gitee.com/hahawa2/simple_api_demo......
  • flask快速上手
    目录1flask介绍fastapiflaskwsgirefWerkzeug2显示用户小案例1flask介绍#python界的web框架 -Django:大而全,快速开发,公司内部项目-Flask:小而精,不具备web开发好多功能,丰富的第三方插件-FastApi:异步框架,主要为了做前后端分离接口-Sanic:异步框架,只支持python3......
  • Mybatis学习(1)——mybatis介绍 & 入门案例 & 全局配置文件详解 & 增删改查 + mybatis事
    Mybatis学习(1)——mybatis介绍&入门案例&全局配置文件详解&增删改查+mybatis事务&mapper.xml文件#{}和${}&动态SQL入门原文链接:https://blog.csdn.net/Pireley/article/details/131520252目录引出一、mybatis是啥1.官网&ORM(ObjectRelationMapping)对象关......
  • URL函数的使用(支持正则表达式)、分组、反向解析、Django2的转换器、路由分发、伪静态的
    url('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数 http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配 去浏览器器搜索textadd只......
  • flask实现登录
    fromflaskimportFlask,request,render_template,redirect,sessionfromfunctoolsimportwrapsapp=Flask(name,template_folder='templates')app.debug=True字符串随便起app.secret_key="affedasafafqwe"@app.route('/')defhel......