flask的简单使用

1 flask介绍

#1 python 界的web框架-Django:大而全,你要的东西都有  [orm,缓存,认证]django-ninja-flask:小而精,所有web开发需要的东西,借助于第三方集成-web.py-----同步框架--进程线程架构--3.x以后支持异步--tornado sanicfastapi:高性能小而精,借助于第三方:orm- Starlette 和 Pydantic----异步框架--协程架构-----性能高

1.1 Werkzeug介绍

Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等

1.2 wsgiref 介绍

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块

from wsgiref.simple_server import make_serverdef mya(environ, start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])if environ.get('PATH_INFO') == '/index':with open('index.html','rb') as f:data=f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data=b'<h1>Hello, web!</h1>'return [data]if __name__ == '__main__':myserver = make_server('', 8011, mya)print('监听8010')myserver.serve_forever()

1.3 Jinja2 介绍

Jinja 是一个快速、富有表现力、可扩展的模板引擎。模板中的特殊占位符允许编写类似于 Python 语法的代码。然后向模板传递数据以渲染最终文档# https://jinja.palletsprojects.com/en/3.1.x/

1.4 click介绍(django中得命令)

Click 是一个 Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的命令行界面。它是“命令行界面创建工具包”。它具有高度可配置性,但具有开箱即用的合理默认值它的目的是使编写命令行工具的过程变得快速而有趣,同时也防止因无法实现预期的 CLI API 而造成的任何挫败感# 3  Click in three points:arbitrary nesting of commands	automatic help page generationsupports lazy loading of subcommands at runtime 
Click三点:命令的任意嵌套自动生成帮助页面支持运行时延迟加载子命令https://click.palletsprojects.com/en/8.1.x/
# pip3 install click
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',help='The person to greet.')
def hello(count, name):for x in range(count):click.echo(f"Hello {name}!")if __name__ == '__main__':hello()# 1  python3 app.py --count=3
# 2  python3 app.py --help
# 3  python3 app.py --count=3 --name=lqz

2 flask创建和运行

2.1 python-dotenv

# pip3 install python-dotenv
import os
from dotenv import load_dotenv
from dotenv import dotenv_values
## 1 加载配置文件
# 必须在根路径下新建一个 .env 的文件,并写入配置才能返回True,会把.env下的配置文件设置进环境变量
res=load_dotenv()  # take environment variables from .env
print(res)
print(os.environ.get('DOMAIN'))
# You will probably want to add .env to your .gitignore, especially if it contains secrets like a password.## 2 获取环境变量字典
config = dotenv_values(".env")
print(config)
print(config.get('DOMAIN'))

2.2 watchdog

# pip3 install watchdog
# 当前目录下文件修改会被监控到,打印日志
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandlerif __name__ == "__main__":logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')path = sys.argv[1] if len(sys.argv) > 1 else '.'event_handler = LoggingEventHandler()observer = Observer()observer.schedule(event_handler, path, recursive=True)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()

2.3 python内置虚拟环境

Use a virtual environment to manage the dependencies for your project, both in development and in production.
# 在开发和生产中,使用虚拟环境来管理项目的依赖关系# 虚拟环境解决什么问题?您拥有的 Python 项目越多,您就越有可能需要使用不同版本的 Python 库,甚至是 Python 本身。一个项目的较新版本的库可能会破坏另一项目的兼容性。# 虚拟环境是一组独立的 Python 库,每个项目对应一个。为一个项目安装的软件包不会影响其他项目或操作系统的软件包Python comes bundled with the venv module to create virtual environments.
# Python 使用 venv 模块来创建虚拟环境

3.2.1 Mac/linux

# 创建虚拟环境
mkdir myproject
cd myproject
python3 -m venv .venv
# 激活虚拟环境
. .venv/bin/activate

3.2.2 Win

# 创建虚拟环境
mkdir myproject
cd myproject
py -3 -m venv .venv
# 激活虚拟环境
.venv\Scripts\activate

2.4 安装

pip install Flask

3 快速入门

3.1 多种方式运行flask

from flask import Flask
app=Flask(__name__)
# 配置路由和视图函数对应关系--》基于装饰器
# @app.route('/',methods=['GET'])
@app.get('/')
def index():return 'hello flask'if __name__ == '__main__':app.run()###### 运行flask项目的几种方式
# 方式一: python -m flask --app 6-第一个flask run
# 方式二: flask --app 6-第一个flask run
# 方式三: flask run --host=0.0.0.0   # py文件必须叫app.py# flask --app hello run --debug
# 方式四:使用pycharm快速运行  配置一个 flaskserver
# 方式五:直接右键运行,必须加入如下代码
if __name__ == '__main__':app.run()# 运行当前项目
python -m flask --app hello run
# 或者
flask --app hello run
flask run --host=0.0.0.0
'''

3.2 debug 模式

# 运行时,开启debug模式
flask --app hello run --debug# debug模式-自动重启-错误提示

3 fastapi 快速使用

  • pip install fastapi
# 异步框架from fastapi import FastAPI
from pydantic import BaseModel
app=FastAPI()class Item(BaseModel):name: strage:int@app.get('/')
async def index():return {'code':100,'msg':'成功'}@app.post('/login')
async def login(item:Item):print(item.name)print(item.age)return itemif __name__ == '__main__':import uvicornuvicorn.run(app='7-第一个fastapi:app',port=8001)#name_app = os.path.splitext(os.path.basename(__file__))[0]#uvicorn.run(app=f"{name_app}:app", port=8000)

4 显示用户案例

''' 学到的
1 返回新手四件套- 返回字符串--》return '字符串'- 返回模板--》render_template('detail.html',info=user)- 返回重定向--》redirect('/login')- 返回json--》jsonify({'code':100,'msg':'成功'})2 request对象,是全局的--》from flask import  request-request.path-request.method.... 有很多,不展开讲--》记django的request---》类似3 前端传入的:请求体   请求参数-请求体:request.form--->编码格式是 urlencoded-请求参数:request.args-->路径后的  /demo01?name=lqz&age=194 渲染 模板--》跟django 90%---》它比django更强大--》可以加括号--》字典可以.get   []for   {{}} 5 session 使用- 设置 app.secret_key='adsfa33w9SAD##@sdr434l'- 设置值:session['username']- 取值:session.get('username')6 路由转换器@app.route('/detail/<int:pk>', methods=['GET'])
'''

4.1 app.py

from flask import Flask, render_template, request, redirect, session,jsonifyapp = Flask(__name__, template_folder="templates", static_folder="static")
app.secret_key='adsfa33w9SAD##@sdr434l' #如果使用session,必须加秘钥# 用户信息
USERS = {1: {'name': '刘亦菲', 'age': 18, 'gender': '男', 'text': "刘亦菲,1987年8月25日出生于湖北省武汉市,华语影视女演员、歌手,毕业于北京电影学院2002级表演系本科",'img':'https://img2.woyaogexing.com/2021/10/16/e3ccba623848430ba83209c0621a2256!400x400.jpeg'},2: {'name': '彭于晏', 'age': 28, 'gender': '男', 'text': "彭于晏,1982年3月24日出生于中国台湾省澎湖县,毕业于不列颠哥伦比亚大学,华语影视男演员。。。。。。。。",'img':'https://img2.woyaogexing.com/2021/10/16/e71aa35728c34313bccb4c371192990f!400x400.jpeg'},3: {'name': '迪丽热巴', 'age': 38, 'gender': '女', 'text': "迪丽热巴(Dilraba),1992年6月3日出生于中国新疆乌鲁木齐市,毕业于上海戏剧学院,中国内地影视女演员",'img':'https://img2.woyaogexing.com/2021/10/30/6a34146dde2d4f1c832463a5be1ed027!400x400.jpeg'},4: {'name': '亚瑟', 'age': 38, 'gender': '男', 'text': "亚瑟,是腾讯手游《王者荣耀》中一名战士型英雄角色,也是《王者荣耀》的新手英雄之一,既可攻又可守",'img':'https://img2.woyaogexing.com/2021/10/30/371b2aa7a03c4f53b7b1bc86f877d7d1!400x400.jpeg'},
}
@app.route('/')
def index():# 7 判断用户是否登录,如果登录了,返回模板if session.get('username'):# 1 返回模板,渲染到模板中return render_template('index.html',user_dict=USERS)# 如果没登录,重定向到loginelse:return redirect('/login')@app.route('/login', methods=['GET', 'POST'])
def login():# 2 判断是get请求还是post请求,需要使用request对象## 2.1 request 正常每次请求都是新的request---》现在flask中全局就一个request--》它会不会乱套?if request.method == 'GET':return render_template('login.html')else:# 3 取出用户名密码--》请求对象中取--》requestusername = request.form.get('username')password = request.form.get('password')if username == 'lqz' and password == '123':# 6 登录成功--》登录信息写入cookie--》使用session写入session['username'] = username# 4 登录成功--》重定向到 indexreturn redirect('/')else:# 5 登录失败--》返回login.html 页面,但是页面中渲染错误信息return render_template('login.html', error='用户名密码错误')@app.route('/detail/<int:pk>', methods=['GET'])
def detail(pk):if session.get('username'):user = USERS.get(pk)return render_template('detail.html',info=user)else:return redirect('/login')@app.route('/demo01', methods=['GET'])
def demo01():request.argsreturn jsonify({'code':100,'msg':'成功'})if __name__ == '__main__':app.run()

4.2 index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script><title>Title</title>
</head>
<body>
<div class="container"><!--    头部--><div class="sticky-top"><header class="d-flex flex-wrap justify-content-center py-3 mb-4 border-bottom"><a href="/" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-dark text-decoration-none"><svg class="bi me-2" width="40" height="32"><use xlink:href="#bootstrap"></use></svg><span class="fs-4">交友平台</span></a><ul class="nav nav-pills"><li class="nav-item"><a href="#" class="nav-link active" aria-current="page">首页</a></li><li class="nav-item"><a href="#" class="nav-link">女生</a></li><li class="nav-item"><a href="#" class="nav-link">男生</a></li><li class="nav-item"><a href="#" class="nav-link">国产</a></li><li class="nav-item"><a href="#" class="nav-link">欧美</a></li></ul></header></div><!--轮播图--><div><div class="bd-example-snippet bd-code-snippet"><div class="bd-example"><div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel"><div class="carousel-indicators"><button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="0" class=""aria-label="Slide 1"></button><button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="1"aria-label="Slide 2" class="active" aria-current="true"></button><button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="2"aria-label="Slide 3" class=""></button></div><div class="carousel-inner"><div class="carousel-item"><img src="https://img.zcool.cn/community/01fb5458fedf57a801214550f9677a.jpg@2o.jpg" alt=""width="100%" height="300"><div class="carousel-caption d-none d-md-block"><h5>激情绿荫</h5><p>Some representative placeholder content for the first slide.</p></div></div><div class="carousel-item active"><img src="https://img2.baidu.com/it/u=2951612437,4135887500&fm=253&fmt=auto&app=138&f=JPEG"alt="" width="100%" height="300"><div class="carousel-caption d-none d-md-block"><h5>品牌雨伞</h5><p>Some representative placeholder content for the second slide.</p></div></div><div class="carousel-item"><img src="https://img1.baidu.com/it/u=1417689082,3333220267&fm=253&fmt=auto&app=138&f=JPEG"alt="" width="100%" height="300"><div class="carousel-caption d-none d-md-block"><h5>家装节</h5><p>Some representative placeholder content for the third slide.</p></div></div></div><button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleCaptions"data-bs-slide="prev"><span class="carousel-control-prev-icon" aria-hidden="true"></span><span class="visually-hidden">Previous</span></button><button class="carousel-control-next" type="button" data-bs-target="#carouselExampleCaptions"data-bs-slide="next"><span class="carousel-control-next-icon" aria-hidden="true"></span><span class="visually-hidden">Next</span></button></div></div></div></div><!--    内容--><div class="row row-cols-md-2" style="padding: 10px">{% for k,v in user_dict.items() %}<div class="card"><div class="row " style="padding: 10px"><img src="{{v.get('img')}}" alt="" class="col-md-4"><div class="col-md-8"><div class="card-body"><h5 class="card-title">{{v['name']}}</h5><p class="card-text">性别:{{v.gender}}</p><p class="card-text">年龄:{{v.age}}</p><p class="card-text"><a href="/detail/{{k}}" class="btn btn-danger">查看详细</a></p></div></div></div></div>{%endfor%}</div><!--    table--><div class="bd-example" style="margin-top: 30px"><table class="table table-hover table-striped table-bordered"><thead><tr class="table-danger"><th colspan="3" class="text-center">更多交友</th></tr></thead><tbody><tr class="table-success"><th>杨幂</th><td>女</td><td>33</td></tr><tr class="table-warning"><th scope="row">刘亦菲</th><td>未知</td><td>40</td></tr><tr class="table-success"><th scope="row">彭于晏</th><td>男</td><td>23</td></tr><tr class="table-warning"><th scope="row">陈奕迅</th><td>男</td><td>44</td></tr><tr class="table-success"><th scope="row">薛之谦</th><td>男</td><td>36</td></tr><tr class="table-warning"><th>李清照</th><td>女</td><td>未知</td></tr></tbody></table></div><!--分页--><div class="d-flex justify-content-center"><ul class="pagination pagination-lg"><li class="page-item"><a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">«</span></a></li><li class="page-item"><a class="page-link" href="#">1</a></li><li class="page-item"><a class="page-link" href="#">2</a></li><li class="page-item"><a class="page-link" href="#">3</a></li><li class="page-item"><a class="page-link" href="#">4</a></li><li class="page-item"><a class="page-link" href="#">5</a></li><li class="page-item"><a class="page-link" href="#">6</a></li><li class="page-item"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li></ul></div><!--    尾部--><div><footer class="py-3 my-4"><ul class="nav justify-content-center border-bottom pb-3 mb-3"><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">首页</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">特性</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">联系我们</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">资料获取</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">关于</a></li></ul><p class="text-center text-muted">Copyright © 1998 - 2029 liuqingzheng. All Rights Reserved. </p></footer></div>
</div>
</body>
</html>

4.3 login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"><title>登录</title>
</head>
<body>
<div class="container col-xl-10 col-xxl-8 px-4 py-5"><div class="row align-items-center g-lg-5 py-5"><div class="col-lg-7 text-center text-lg-start"><h1 class="display-4 fw-bold lh-1 mb-3">亚洲最大交友平台</h1><p class="col-lg-10 fs-4">Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师MarkOtto和Jacob Thornton合作开发,是一个CSS/HTML框架。目前,Bootstrap最新版本为5.0</p></div><div class="col-md-10 mx-auto col-lg-5"><form class="p-4 p-md-5 border rounded-3 bg-light" method="post"><div class="form-floating mb-3"><input type="text" class="form-control" id="floatingInput" placeholder="name@example.com" name="username"><label for="floatingInput">用户名</label></div><div class="form-floating mb-3"><input type="password" class="form-control" id="floatingPassword" placeholder="Password" name="password"><label for="floatingPassword">密码</label></div><div class="checkbox mb-3"><label><input type="checkbox" value="remember-me"> 记住密码</label></div><button class="w-100 btn btn-lg btn-primary" type="submit">登录</button><hr class="my-4"><small class="text-muted">{{error}}</small></form></div></div>
</div>
</body>
</html>

4.4 detai.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script><title>Title</title>
</head>
<body>
<div class="container"><div class="sticky-top"><header class="d-flex flex-wrap justify-content-center py-3 mb-4 border-bottom"><a href="/" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-dark text-decoration-none"><svg class="bi me-2" width="40" height="32"><use xlink:href="#bootstrap"></use></svg><span class="fs-4">交友平台</span></a><ul class="nav nav-pills"><li class="nav-item"><a href="#" class="nav-link active" aria-current="page">首页</a></li><li class="nav-item"><a href="#" class="nav-link">女生</a></li><li class="nav-item"><a href="#" class="nav-link">男生</a></li><li class="nav-item"><a href="#" class="nav-link">国产</a></li><li class="nav-item"><a href="#" class="nav-link">欧美</a></li></ul></header></div><div class="position-relative overflow-hidden p-3 p-md-5 m-md-3 text-center bg-light"><div class="col-md-5 p-lg-5 mx-auto my-5"><h1 class="display-4 fw-normal">{{info.name}}</h1><img src="{{info.img}}" alt=""width="300px" height="300px" style="margin: 20px"><p class="lead fw-normal">{{info.text}}</p><a class="btn btn-outline-secondary" href="#">收藏</a></div><div class="product-device shadow-sm d-none d-md-block"></div><div class="product-device product-device-2 shadow-sm d-none d-md-block"></div></div><div><footer class="py-3 my-4"><ul class="nav justify-content-center border-bottom pb-3 mb-3"><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">首页</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">特性</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">联系我们</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">资料获取</a></li><li class="nav-item"><a href="#" class="nav-link px-2 text-muted">关于</a></li></ul><p class="text-center text-muted">Copyright © 1998 - 2029 liuqingzheng. All Rights Reserved. </p></footer></div></div>
</body>
</html>

4.5 登录认证装饰器

# 问题一:登录装饰器,放上还是下  放下面
# 问题二:每个路由有个别名【反向解析】--》这个别名如果不写--》会以函数名作为别名--》一旦加了登录认证装饰器,所有别名都变成了 inner# 1 使用装饰器装饰装饰器  @wraps(func)# 2 每个人都指定别名
from flask import Flask, render_template, request, redirect, session, jsonifyapp = Flask(__name__, template_folder="templates", static_folder="static")
app.secret_key = 'adsfa33w9SAD##@sdr434l'  # 如果使用session,必须加秘钥from functools import wraps
# 用户登录,写个装饰器
def login_required(func):# @wraps(func)def inner(*args, **kw):# 判断有没有登录if session.get('username'):res = func(*args, **kw)return reselse:return redirect('/login')return inner# 用户信息
USERS = {1: {'name': '刘亦菲', 'age': 18, 'gender': '男', 'text': "刘亦菲,1987年8月25日出生于湖北省武汉市,华语影视女演员、歌手,毕业于北京电影学院2002级表演系本科",'img': 'https://img2.woyaogexing.com/2021/10/16/e3ccba623848430ba83209c0621a2256!400x400.jpeg'},2: {'name': '彭于晏', 'age': 28, 'gender': '男', 'text': "彭于晏,1982年3月24日出生于中国台湾省澎湖县,毕业于不列颠哥伦比亚大学,华语影视男演员。。。。。。。。",'img': 'https://img2.woyaogexing.com/2021/10/16/e71aa35728c34313bccb4c371192990f!400x400.jpeg'},3: {'name': '迪丽热巴', 'age': 38, 'gender': '女', 'text': "迪丽热巴(Dilraba),1992年6月3日出生于中国新疆乌鲁木齐市,毕业于上海戏剧学院,中国内地影视女演员",'img': 'https://img2.woyaogexing.com/2021/10/30/6a34146dde2d4f1c832463a5be1ed027!400x400.jpeg'},4: {'name': '亚瑟', 'age': 38, 'gender': '男', 'text': "亚瑟,是腾讯手游《王者荣耀》中一名战士型英雄角色,也是《王者荣耀》的新手英雄之一,既可攻又可守",'img': 'https://img2.woyaogexing.com/2021/10/30/371b2aa7a03c4f53b7b1bc86f877d7d1!400x400.jpeg'},
}# 问题一:登录装饰器,放上还是下  放下面
# 问题二:每个路由有个别名【反向解析】--》这个别名如果不写--》会以函数名作为别名--》一旦加了登录认证装饰器,所有别名都变成了 inner# 1 使用装饰器装饰装饰器  @wraps(func)# 2 每个人都指定别名@app.route('/',endpoint='index')
@login_required
def index():return render_template('index.html', user_dict=USERS)@app.route('/login', methods=['GET', 'POST'])
def login():# 2 判断是get请求还是post请求,需要使用request对象## 2.1 request 正常每次请求都是新的request---》现在flask中全局就一个request--》它会不会乱套?if request.method == 'GET':return render_template('login.html')else:# 3 取出用户名密码--》请求对象中取--》requestusername = request.form.get('username')password = request.form.get('password')if username == 'lqz' and password == '123':# 6 登录成功--》登录信息写入cookie--》使用session写入session['username'] = username# 4 登录成功--》重定向到 indexreturn redirect('/')else:# 5 登录失败--》返回login.html 页面,但是页面中渲染错误信息return render_template('login.html', error='用户名密码错误')@app.route('/detail/<int:pk>', methods=['GET'],endpoint='detail')
@login_required
def detail(pk):user = USERS.get(pk)return render_template('detail.html', info=user)@app.route('/demo01', methods=['GET'])
def demo01():request.argsreturn jsonify({'code': 100, 'msg': '成功'})if __name__ == '__main__':app.run()

5 flask的配置文件

# 1 django中配置文件用的是: settings.py-实际开发中用了两套配置文件# 2 flask配置文件使用--之 默认配置项- -debug --SECRET_KEYprint(app.config)flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:{'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式'TESTING':                              False,                          是否开启测试模式'PROPAGATE_EXCEPTIONS':                 None,                          'PRESERVE_CONTEXT_ON_EXCEPTION':        None,'SECRET_KEY':                           None,'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),'USE_X_SENDFILE':                       False,'LOGGER_NAME':                          None,'LOGGER_HANDLER_POLICY':               'always','SERVER_NAME':                          None,'APPLICATION_ROOT':                     None,'SESSION_COOKIE_NAME':                  'session','SESSION_COOKIE_DOMAIN':                None,'SESSION_COOKIE_PATH':                  None,'SESSION_COOKIE_HTTPONLY':              True,'SESSION_COOKIE_SECURE':                False,'SESSION_REFRESH_EACH_REQUEST':         True,'MAX_CONTENT_LENGTH':                   None,'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),'TRAP_BAD_REQUEST_ERRORS':              False,'TRAP_HTTP_EXCEPTIONS':                 False,'EXPLAIN_TEMPLATE_LOADING':             False,'PREFERRED_URL_SCHEME':                 'http','JSON_AS_ASCII':                        True,'JSON_SORT_KEYS':                       True,'JSONIFY_PRETTYPRINT_REGULAR':          True,'JSONIFY_MIMETYPE':                     'application/json','TEMPLATES_AUTO_RELOAD':                None,}# 3 修改默认# 方式一:直接在app上改,实际他们在config属性上(开发阶段用)app.debug=Trueapp.secret_key='asdfasdf'# 方式二:通过app.config改--》celery就是这样app.config['DEBUG']=Trueapp.config['SECRET_KEY']='aaaa'# 方式三:app.config.from_pyfile("python文件名称")--跟django一样1 写一个 settings.py2 app.config.from_pyfile('settings.py')# 方式四:app.config.from_object('settings.TestingConfig')class Config(object):DEBUG = FalseTESTING = FalseDATABASE_URI = '127.0.0.1'DATABASE_PORT = 3306class ProductionConfig(Config):DATABASE_URI = '192.168.1.11'DATABASE_PORT = 3308class DevelopmentConfig(Config):DEBUG = True# 方式其他:app.config.from_envvar("环境变量名称")app.config.from_json("json文件名称") app.config.from_mapping({'DEBUG': True}) #可能会用- 配置中心---》服务--》有个地址,发送请求会返回一对json格式配置文件-nocos# dotenv的使用# 4 设置自己(跟修改默认一样)-app.config['DB_PASSWORD']='lqz123'

6 路由系统

6.1基本使用装饰器

 @app.route('/',methods=['GET'])@app.get()@app.post()

6.2 路由系统本质-->另一种写法

#1  使用的时候:@app.route('/',methods=['GET']) #--》decorator--》index=decorator(index)
def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]:def decorator(f: T_route) -> T_route:#1 如果没有传 endpoint ,就是Noneendpoint = options.pop("endpoint", None)#2 self 是 app对象,是Flask类的对象--》Flask类中得add_url_rule方法是路由的本质self.add_url_rule(rule, endpoint, f, **options)return freturn decorator
#2  于是,注册路由,我们可以不用装饰,自己写
app.add_url_rule('/index',endpoint=None,view_func=index,methods=['GET']) # 等同于django的path

6.3 route的参数,其实就是add_url_rule的参数

  • rule, URL规则,路径
view_func, 视图函数名称
defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}-为函数提供参数 ---》django中也有,叫kwargs
endpoint = None, 名称[别名],用于反向生成URL,即: url_for('名称')
methods = None, 允许的请求方式,如:["GET", "POST"]
strict_slashes = None 对URL最后的 / 符号是否严格要求
```
@app.route('/index', strict_slashes=False)
#访问http://www.xx.com/index/ 或http://www.xx.com/index均可
@app.route('/index', strict_slashes=True)
#仅访问http://www.xx.com/index
```
redirect_to = None重定向到指定地址@app.route('/index/<int:nid>', redirect_to='/home/<nid>')
#subdomain = None子域名访问    
from flask import Flaskapp = Flask(__name__)
app.debug=True# @app.route('/')
def index():  # put application's code herereturn 'Hello World!'
def login():return 'login'app.add_url_rule('/','index',index,methods=['GET'])
app.add_url_rule('/login','login',login)if __name__ == '__main__':app.run()

6.4转换器

 # 4 转换器 app.add_url_rule('/index/<int:pk>')
DEFAULT_CONVERTERS = {'default':          UnicodeConverter,'string':           UnicodeConverter,'any':              AnyConverter,'path':             PathConverter,'int':              IntegerConverter,'float':            FloatConverter,'uuid':             UUIDConverter,
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/732319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟集成电路设计系列博客——7.5.5 折叠型ADC

7.5.5 折叠型ADC 我们刚了解完输入放大器的数量如何通过插值型架构来减少。但是对于一个N bit的ADC来说,仍然需要\(2^N\)个锁存比较器。这个大量的比较器数量可以通过折叠型ADC架构来减少。折叠型ADC架构类似于两步型ADC,一组LSB分离于一组MSB进行独立的查找。但是,相比两步…

240627构造

20240627构造专题 写在前面:出场即巅峰(明日模拟赛RP++) 一.何为构造 就是通过对一道题题面的分析可以发现某种规律(类似于不完全归纳法),然后发掘本质,就可以很快的解题,但是显然我还没有掌握 二.一些技巧 1.寻找特殊性质,从而求解 2.估算上界(也就是对最优情况进行…

别人工作8小时,我只需1小时!这些宝藏网站我都替你收集好了!

mac免费应用,效率工具,编程工具,设计网站,图片网站,通通一网打尽软件mac应用下载 很多破解版应该都可以找到snipaste: 截图工具,快捷截图,贴图等功能。幕布: 快速编辑思维导图。sublime text: 文档编辑器(打开速度贼快)。visual studio code: 新一代编辑器(插件非常…

VLC工具使用指南

一、引言 VLC(VideoLAN Client)是一款功能强大的免费开源跨平台多媒体播放器和框架,能够播放大多数多媒体文件以及DVD、音频CD、VCD和各种流媒体协议。无论是本地视频文件还是网络视频流,VLC都能轻松应对。本文将详细介绍VLC工具的基本用法和高级功能。 二、安装与设置 下载…

递归示例-指定数字以内的所有排列组合(Reduce)

指定数字以内的所有排列组合: 定义名称版:=pmtt(指定数字)pmtt=LAMBDA(x,IF(x=1,1,VSTACK(pmtt(x-1),REDUCE(SEQUENCE(x),SEQUENCE(,x-1)^0*x,LAMBDA(a,b,TOCOL(a&SEQUENCE(,b)))))))不定义名称版:=LET(fx,LAMBDA(npmtt,x,IF(x=1,1,VSTACK(npmtt(npmtt,x-1),REDUCE(SEQU…

nodejs解压zip/rar文件到本地,并获取到解压进度

方案:解压到本地的大小 / zip文件总大小(解压后的) ,得出解压进度 先得出解压后的文件大小,然后解压到本地const AdmZip = require("adm-zip"); const JSZip = require(jszip);// 指定ZIP文件的路径 const admZip = new AdmZip("D:\\Users\\whr4220\\Downloa…

畅联云看视频卡顿、画质不清原因可能是一些参数没有配置对

在畅联云平台观看视频时,很多用户可能会遇到卡顿和画质不清晰的问题。这些问题往往由多种因素共同导致,包括网络带宽与传输质量、视频编码与压缩、服务器性能与负载均衡,以及视频源质量等。本文我们将重点说一下摄像机上面的一些可能影响视频卡顿和画质的参数。 打开摄像机w…

R语言独立成分分析fastICA、谱聚类、支持向量回归SVR模型预测商店销量时间序列可视化|附代码数据

全文链接:http://tecdat.cn/?p=31948 原文出处:拓端数据部落公众号 本文利用R语言的独立成分分析(ICA)、谱聚类(CS)和支持向量回归 SVR 模型帮助客户对商店销量进行预测。 首先,分别对商店销量的历史数据进行了独立成分分析,得到了多个独立成分;其次,利用谱聚类方法…

Profibus协议转Modbus协议网关模块在船舶中的应用

本文主要介绍了Profibus协议转Modbus协议网关模块(XD-MDPB100)在船舶中的应用。 Profibus转Modbus网关能实现Profibus总线和Modbus协议之间的数据转换与对接,为船舶系统之间的信息交换提供便利。一、背景 在当今数字化快速发展的时代,船舶作为重要的交通工具之一,也在不断…

sessionStorage 能在多个标签页之间共享数据吗?

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 最近,我的一个朋友在面试中被一个关于 sessionStorage 的问题难住了。我们来聊聊这个话题。sessionStorage 能在多个标签页之间共享数据吗?在回答这个问题之前我们先来聊聊另一个存储API localstorage localstorage与s…

2024-06-27 java spring boot项目用maven打包报错:xxx-0.0.1-SNAPSHOT.jar中没有主清单属性

问题如下: 原因:打包文件pom.xml配置问题<skip>true</skip>不能为true!为true时,此处引用网友的解释: 在spring-boot-maven-plugin的配置中设置 <skip>true</skip> 时,实际上你告诉Maven在执行构建生命周期时跳过这个插件的运行。此插件负责将你的…

如何设计一个好的测试用例

如何理解一个“好的”测试用例? “好的”测试用例一定是一个完备的集合,它能够覆盖所有等价类以及各种边界值,而跟能够发现缺陷无关。 举例子: 被测软件 --- 鱼塘 软件缺陷 --- 鱼 测试用例集 --- 渔网 “好的”测试用例集就是一张能够覆盖整个鱼塘的大鱼网,只要鱼塘里有鱼…

聚类模型的算法性能评价

一、概述作为机器学习领域的重要内容之一,聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类,就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类,使得同一个簇内的样本有着更相近的属性。依不同的实现策略,聚类算法有很多种,如基于距离的k-means、基于密…

常见的域名劫持现象

在当今数字化的时代,互联网已经成为人们生活和工作中不可或缺的一部分。然而,随着网络的普及和发展,一些安全问题也逐渐浮现,域名劫持就是其中之一。域名劫持不仅会给用户带来不便,还可能导致严重的安全隐患。下面让我们来了解一些常见的域名劫持现象。 1、一种常见的域名…

SymPy-1-13-中文文档-十一-

SymPy 1.13 中文文档(十一)原文:docs.sympy.org/latest/index.html离散原文链接:docs.sympy.org/latest/modules/discrete.html在 SymPy 的discrete模块中实现了计算有限序列的离散变换和卷积的方法。 该模块包含对离散序列操作的函数。 Transforms - fft, ifft, ntt, intt…

SymPy-1-13-中文文档-十五-

SymPy 1.13 中文文档(十五)原文:docs.sympy.org/latest/index.html物理原文:docs.sympy.org/latest/reference/public/physics/index.html一个帮助解决物理问题的模块。 目录氢波函数矩阵泡利代数一维量子谐振子三维量子谐振子二次量子化Wigner 符号单位系统单位系统背后的…

SymPy-1-13-中文文档-七-

SymPy 1.13 中文文档(七)原文:docs.sympy.org/latest/index.html积分原文:docs.sympy.org/latest/modules/integrals/index.html本模块文档包含有关梅耶尔 G 函数和 SymPy 积分的详细信息。 内容使用梅耶尔 G 函数计算积分积分使用 Meijer G 函数计算积分docs.sympy.org/la…

克服指标管理痛点,实现数据价值最大化

在当下的企业管理中,由于数据量的激增,管理方式逐渐从基于经验转向基于数据。在此过程中,我们能够通过数据探查业务情况、分析数据,从而获取更优的决策支持数据。这通常通过数据报表或分析平台来实现,对于临时性场景,则会基于日常取数方式进行临时数据分析。 但在此过程中…

Ubuntu22.4环境下npm下载gdal失败

https://www.npmjs.com/package/gdal https://github.com/naturalatlas/node-gdal从错误日志来看,安装gdal模块时遇到了几个问题,导致安装失败。以下是几个关键点:缺少预构建二进制文件: node-pre-gyp ERR! install response status 404 Not Found on https://github.com/n…