flask知识--01

flask介绍

# python 界的web框架:
    Django:大而全,使用率较高 :https://github.com/django/django
    -FastAPI:新项目选择使用它:https://github.com/tiangolo/fastapi
    -flask:公司一些小项目使用它:https://github.com/pallets/flask
# flask:
        Flask是一个用Python编写的Web应用框架。它由Armin Ronacher开发,他领导着一个名为Pocco的国际Python爱好者团队。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目

        Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器
        “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握

        默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用

       Werkzeug WSGI:接收请求   django 中得 wsgiref
        jinja2模板: 渲染模板的  django中得dtl
        Click CLI:命令定制工具   django 的 manage.py runserver/migrate...
# flask fastapi 跟django的不同: 
相同点:都python的web框架
不同点:

        1、django比较全面,web开发中使用到的东西,它都会内置
                   eg.orm、forms组件,表单验证、模板:dtl、缓存、信号、admin 后台管理...
       2、flask小而精,只保留了web开发的核心功能,其他的需要借助于第三方实现
                   eg.orm咱们会用sqlalchemy,peewee。。
        3、fastapi: 跟flask相似,只保留了web开发的核心功能,其他的需要借助于第三方实现
            异步框架
            更方便的使用python  async 和 await 关键字来实现异步操作

flask 安装和运行

# 安装:pip3 install flask

            安装完成后,会在script目录下多flask.exe 命令,后期运行flask需要使用它

# 版本之间差距不大:
            1.x   
            2.x:比较稳定
            3.x版本:最新

                最新版本,最低支持 python3.8

# 安装flask时,会自动安装一些其他模块:

        运行服务、模板、防止xss攻击、cookie加密、制定命令、信号

# 这些依赖不会自动安装,如果您安装它们,Flask 将检测并使用它们:

        可以把key和value放到环境变量,使用这个模块可以操作

        flask修改了代码,他会检测到并重新运行,最新代码

# 快速体验:

from flask import Flask# 1 实例化得到对象
app = Flask(__name__)# 2 注册路由--》写视图函数
@app.route('/')
def index():# 3 返回给前端字符串return 'hello world'if __name__ == '__main__':# 运行app,默认运行在5000app.run(host='0.0.0.0',port=8080)

Werkzeug WSGI-(socket服务端)

# 概念:https://werkzeug.palletsprojects.com/en/3.0.x/

        Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。

        这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等
        Werkzeug 是一个综合性 WSGI Web 应用程序库。它最初是 WSGI 应用程序的各种实用程序的简单集合,现已成为最先进的 WSGI 实用程序库之一。
        Werkzeug 不强制执行任何依赖关系。由开发人员选择模板引擎、数据库适配器,甚至# # 如何处理请求:

        django--->wsgiref ,uwsgi
        flask---->Werkzeug
# django或flask都需要有web服务器:

        web服务器需要符合 wsgi协议,规定了框架是一个可调用对象,请求来了,wsgi服务器调用这个对象的时候,会传入 两个参数environ,start_response
      flask中能找到这两个参数,django中也能找到这两个参数

  

# 后期:
    测试django项目,使用wsgiref,上线djagno项目,使用uwsgi,gunicorn
    测试flask项目,使用werkzeug,上线djagno项目,使用uwsgi,gunicorn

# 1 了解即可
# 写了一个可调用对象,可以使用符合wsig协议的web服务器来调用,执行它def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/plain')])return ['Hello World!'.encode('utf-8')]# 2 使用符合wsgi协议的web服务器调用它
from wsgiref.simple_server import make_server# 咱们这个application 函数---》它就是 django框架或flask框架
# def application(environ, start_response):
#     start_response('200 OK', [('Content-Type', 'text/plain')])
#     return ['Hello World!'.encode('utf-8')]
def application(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, application)print('监听8011')myserver.serve_forever()### 3 使用werkzeug 运行 application
# 有了 Request和Response,路由分发,可以获取静态文件,可以返回html页面
from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple
def application(environ, start_response):request = Request(environ)text = f"Hello {request.args.get('name', 'World')}!"response = Response(text, mimetype='text/plain')return response(environ, start_response)if __name__ == '__main__':run_simple('localhost', 4000, application)

Jinja template engine

# 概念:Jinja 是一个快速、富有表现力、可扩展的模板引擎。

模板中特殊占位符允许编写类似于Python语法的代码,然后向模板传递数据以渲染最终文档

# 特点:语法完全支持 dtl,但比dtl更强大
        https://jinja.palletsprojects.com/en/3.1.x/

Click CLI

# 概念:https://click.palletsprojects.com/en/8.1.x/

        Click 是一个Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的命令行界】,它是“命令行界面创建工具包”,具有高度可配置性,但具有开箱即用的合理默认值

# 目的:

        使编写命令行工具的过程变得快速而有趣,同时也防止因无法实现预期的 CLI API 而造成的任何挫败感
# Click三点:1、命令的任意嵌套
                      2、自动生成帮助页面
                      3、支持运行时延迟加载子命令

# 安装: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

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

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'))
# print(os.environ.get('NAME'))
# print(os.environ.get('AGE'))
# 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'))
print(config.get('NAME'))
print(config.get('HOBBY'))

虚拟环境

# 概念:虚拟环境是一组独立的 Python 库,每个项目对应一个,为一个项目安装的软件包不会影响其他项目或操作系统的软件包,在开发和生产中,使用虚拟环境来管理项目的依赖关系

# 虚拟环境解决什么问题?

        您拥有的 Python 项目越多,您就越有可能需要使用不同版本的 Python 库,甚至是 Python 本身。一个项目的较新版本的库可能会破坏另一项目的兼容性。

# python内置(venv)可以直接创建虚拟环境:
Mac/linux

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

Win

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

运行flask 项目方式

# pip install flask# 写个py文件,写入
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'hello world'

# 运行项目方式:
方式一(pycharm配置):
       新建一个flask-server,配置选中 script,有app的文件


方式二:命令(推荐这种)
        flask --app py文件名字  run
        flask --app 5-flask再体验.py run

方式三:命令
        python38 -m flask --app py文件名字 run
        python38 -m flask --app 5-flask再体验.py run

方式四,右键运行

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

方式五:命令运行(跟右键运行一样)
        python38 5-app.py
方式6:少用(pip install python-dotenv)
        flask app run

debug 模式

flask --app 5-app.py run --debug

#  浏览器显示错误信息
# 改了代码自动重启

fastapi

# from typing import Union  # python 的内置--》数据校验
import timefrom fastapi import FastAPI
import asyncioapp = FastAPI()@app.get("/")
async def read_root():# 如果有ioawait asyncio.sleep(2)# time.sleep(10)return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id, q=None):return {"item_id": item_id, "q": q}

# 天生自带接口文档,方便我们快速写前后端分离的接口

        uvicorn 7-fast-api初体验:app

# 针对于io多的web后端,使用异步框架,会提高性能
        咱们项目,基本都是io多,查询数据库,redis 都是io操作
        使用fastapi能提高并发量

显示用户小案例

from flask import Flask, render_template, request, redirectapp = Flask(__name__)@app.route('/login',methods=['GET','POST'])
def login():if request.method == 'GET':# 返回模板return render_template('login.html')else:# 取出用户名密码,判断# flask的request 没有POST,GET# request.form  就是 post# request.args  就是 GETusername = request.form.get('username')password = request.form.get('password')if username == 'zjq' and password == '123':# 重定向到百度return redirect('https://www.baidu.com')else:return render_template('login.html', error= '用户名密码错误')# 右键运行
if __name__ == '__main__':app.run(debug=True)
# templates/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>

今日思维导图:

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

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

相关文章

Mysterious-GIF-攻防世界-MISC

题目简介&#xff1a; 下载得到gif文件&#xff0c;十六进制编辑器查看&#xff0c;发现末尾有50 4B 03 04文件头。提取后保存为zip文件。 解压该zip文件&#xff0c;得到temp.zip。十六进制编辑器查看temp.zip&#xff0c;会发现有多个文件头和文件尾。 用binwalk分离temp.zi…

如何在windows系统部署Lychee网站,并结合内网穿透打造个人云图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

接口测试的测试要点

接口测试的测试要点&#xff0c;你知道都有哪些吗&#xff1f; 接口测试是软件测试中的重要组成部分&#xff0c;它的目的是评估接口的质量和可靠性&#xff0c;以保证系统的正常运行。在进行接口测试时&#xff0c;必须要考虑到以下几个方面&#xff1a; 测试用例的编写 测试…

ts的重载

官网示例 这里大概理解是 T 继承了Number|sting 加上&#xff1f;条件判断就是 T继承Number|sting 部分为true 没有继承部分为false&#xff0c; 就是输入string, 为true, 输入 null 则为false, type Exclude<T, U> T extends U ? never : T; // 相当于: type A …

CS_上线三层跨网段机器(完整过程还原)

以前讲过用cs_smb_beacon上线不出网机器&#xff0c;但是真实的网络拓扑肯定不止这么一层的网络&#xff01; 所以我就来搭建一个复杂一点的网络环境&#xff01;&#xff01; 当然了&#xff0c;这三台电脑之间都是不同的网段&#xff0c;&#xff08;但是同属于一个域环境&a…

golang学习7,glang的web的restful接口结构体传参

接口&#xff1a; //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…

Qt6.8 GRPC功能使用(2)标准 Qt实现客户端

简介 基于之前的文章所说&#xff0c; Qt6.7之后才开始支持客户端、服务端、及双向流&#xff0c;恰好电脑需要重装&#xff0c;看到Qt6.8版本就直接安装了&#xff0c;内容也是使用Qt6.8的版本进行编译的 客户端实现步骤 1. 安装Qt6.8, 包含GRPC功能模块 Qt 6.8安装目录下包…

5G网络介绍

目录 一、网络部署模式 二、4/5G基站网元对标 三、4/5G系统架构对比 四、5G核心单元 五、边缘计算 六、轻量化&#xff08;UPF下沉&#xff09; 方案一&#xff1a;UPF下沉 方案二&#xff1a;UPF下沉 方案三&#xff1a;5GC下沉基础模式 方案四&#xff1a;…

05 动力云客之分页查询用户 + 查询用户详情 + 新增用户

1. 用户列表分页查询实现 核心 使用pageHelper实现分页 GetMapping(value "api/users")//分页的参数可以不传, 不传就默认设置为1public R userPage(RequestParam(value "current", required false) Integer current) {if (current null) {current …

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集&#xff0c;通过设置tree-prop的属性进行设置&#xff0c;子级的children的名字可以根据自己的子级名字进行替换&#xff0c;当然同样可以对数据处理成含有chilren的子级list。 问题&#xff1a; 1.如果是根据后…

c++中使用lambda表达式的作用和用法

lambda表达式&#xff1a; 这是C11引入的一种新特性&#xff0c;它可以让您在需要定义函数对象的地方&#xff0c;直接编写一个匿名的、可以捕获上下文变量的函数体&#xff0c;非常适合用作回调函数、临时计算或定义小型函数对象。 lambda表达式与普通函数类似&#xff0c;也有…

存内计算技术大幅提升机器学习算法的性能—挑战与解决方案探讨

一.存内计算技术大幅机器学习算法的性能 1.1背景 人工智能技术的迅速发展使人工智能芯片成为备受关注的关键组成部分。在人工智能的构建中&#xff0c;算力是三个支柱之一&#xff0c;包括数据、算法和算力。目前&#xff0c;人工智能芯片的发展主要集中在两个方向&#xff1…

云计算新宠:探索Apache Doris的云原生策略

文章目录 Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入 Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源 关于 Apache Doris 开源社区基于云原生向量数据库Milvus…

腾讯云服务器宝塔面板中Docker应用无法访问

今天在用宝塔面板的时候用Docker一键部署Jenkins 发现部署好了端口也都开放了&#xff0c;防火墙也都开放了&#xff0c;安全组也都开放了。但是就是访问不了。 解决办法&#xff0c;在服务器终端执行下面指令 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf &…

vmware 中虚拟机Ubuntu磁盘不够,扩展磁盘,并分配

vmware 中虚拟机Ubuntu磁盘不够&#xff0c;扩展磁盘&#xff0c;并分配 Ubuntu虚拟机处于关机状态。虚拟机 -> 设置 ->硬盘 ->扩展 &#xff0c;可以直接多给点&#xff0c;这里只是做演示。 3.开启虚拟机&#xff0c;一般不会报错&#xff0c;我这里报错了&#…

Base 链官方点名 $AYB,继续飙涨指日可待?

近期 $AYB&#xff08;All Your Base Are Belong To Us&#xff09; 成为了 BASE 链上最火的 meme 项目&#xff0c;据悉 $AYB 在去年年底上线至今涨幅已经超过了 100 倍&#xff0c;其在被各大加密社区、KOL 追捧的同时&#xff0c;也被公认是继 Solana 上的 $BONK、Avalanche…

【Leetcode每日一题】二分查找 - 寻找旋转排序数组中的最小值(难度⭐⭐)(22)

1. 题目解析 Leetcode链接&#xff1a;153. 寻找旋转排序数组中的最小值 这个题目乍一看很长很复杂&#xff0c;又是旋转数组又是最小值的 但是仔细想想&#xff0c;结合题目给的示例&#xff0c;不难看出可以用二分的方法来解决 核心在于找到给定数组里面的最小值 2. 算法原…

亚信安慧AntDB开启超融合数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&…

协议-http协议-基础概念01-发展历程-http组成-http是什么-相关的应用-相关的协议

发展历程-http组成-http是什么-相关的应用-相关的协议 参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-HTTP的发展历程 1989 年&#xff0c;任职于欧洲核子研究中心&#xff08;CERN&#xff09;的蒂姆伯纳斯 - 李&#xff08;Tim Ber…