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,默认运行在5000
    app.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 LoggingEventHandler

if __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 Flask

app = 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 time

from fastapi import FastAPI
import asyncio

app = FastAPI()


@app.get("/")
async def read_root():
    # 如果有io
    await 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, redirect

app = 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  就是 GET
        username = 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的设计师Mark
                Otto和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>

今日思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息&#xff1a;International Journal of Multiphase Flow 2023 级别&#xff1a;EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

探讨:围绕 props 阐述 React 通信

在 ✓ &#x1f1e8;&#x1f1f3; 开篇&#xff1a;通过 state 阐述 React 渲染 中&#xff0c;以 setInterval 为例&#xff0c;梳理了 React 渲染的相关内容。 &#x1f4e2; 本篇会 ✓ &#x1f1e8;&#x1f1f3; 围绕 props 阐述 React 通信 props React 组件使用 pro…

7.1 嵌入式软件设计资源管理-引言

1、简介 实时和嵌入式系统的一个显著特点是对有限资源的管理。这些资源可能是CPU时间、内存、网络带宽等&#xff0c;它们的有限性要求系统设计者必须精心管理以确保系统的高效运行。 1.1 资源管理 资源管理是实时和嵌入式系统设计中的一个核心问题&#xff0c;涉及CPU时间、…

三、软件-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息&#xff0c;自动进行数据处理和计算&#xff0c;并输出结果信息的机器系统。 冯诺依曼体系计算机结构&#xff1a; 1、计算机硬件组成 冯诺依曼计算机结构将…

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台&#xff0c;可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据&#xff0c;构建对数据流的变化进行实时反应的应用程序&#xff0c;已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…

Keepalived双机热备——Haproxy搭建web群集

一、认识keepalived keepalived是一个开源的软件&#xff0c;用于实现高可用性和负载均衡。它主要用于在多个服务器之间提供故障转移和负载均衡的功能。keepalived可以监控服务器的状态&#xff0c;并在主服务器发生故障时自动将备份服务器切换为主服务器&#xff0c;以确保服…

统计分析笔记3

文章目录 统计检验选择正确的统计检验统计检验是做什么的&#xff1f;何时进行统计检验选择参数化测试&#xff1a;回归、比较或相关性选择非参数检验 假设检验的假设条件skewness什么是零偏度right skewleft skew计算skewnesswhat to do if your data is skewed kurtosis怎么计…

Python进阶学习:Pandas--将一种的数据类型转换为另一种类型(astype())

Python进阶学习&#xff1a;Pandas–将一种的数据类型转换为另一种类型(astype()) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

【C++那些事儿】深入理解C++类与对象:从概念到实践(上)| 揭开this指针的神秘面纱

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C那些事儿 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 1. 面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符…

TikTok云手机可以运营多少个账号

在社交媒体平台上&#xff0c;尤其是像TikTok这样的热门应用中&#xff0c;账号运营已经成为了许多人的日常工作。而利用云手机技术&#xff0c;一台手机能够同时运营多个TikTok账号&#xff0c;为用户带来了更大的便利和灵活性。本文将探讨 TikTok云手机能够运营多少个账号&am…

网站的安全防护需要注意哪些问题?有什么方法可以加固网站的防护

网站的安全防护&#xff0c;是一项复杂性、多方面的系统工程。现如今网络安全风险的增加&#xff0c;使得上至国家部门机关&#xff0c;小到个人博客&#xff0c;都有可能遭受网络安全问题。说到网络安全问题&#xff0c;比如&#xff1a;竞争最为激烈的游戏行业&#xff0c;从…

【GO开发工程师】grpc进阶#golang

【GO开发工程师】grpc进阶#golang 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】grpc进阶#golang1、protobuf2、grpc2.1、gRPC 的 Metadata机制2.2、grpc拦截器 1、protobuf syntax "proto3"; // 指定使用的 protobuf 版本为 proto3 import…

配置前端项目到 github-pages

Quickstart for GitHub Pages - GitHub Docs

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

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

大模型(LLM)的token学习记录-I

文章目录 基本概念什么是token?如何理解token的长度&#xff1f;使用openai tokenizer 观察token的相关信息open ai的模型 token的特点token如何映射到数值&#xff1f;token级操作&#xff1a;精确地操作文本token 设计的局限性 tokenizationtoken 数量对LLM 的影响训练模型参…

设计模式七:责任链模式

文章目录 1、责任链模式2、spring中的责任链模式Spring InterceptorServlet FilterNetty 1、责任链模式 责任链模式为请求创建了一个接收者对象的链&#xff0c;在这种模式下&#xff0c;通常每个节点都包含对另一个节点者的引用。每个节点针对请求&#xff0c;处理自己感兴趣…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

特征融合篇 | YOLOv8 引入通用高效层聚合网络 GELAN | YOLOv9 新模块

今天的深度学习方法专注于如何设计最合适的目标函数,以使模型的预测结果最接近真实情况。同时,必须设计一个合适的架构,以便为预测提供足够的信息。现有方法忽视了一个事实,即当输入数据经过逐层特征提取和空间转换时,会丢失大量信息。本文将深入探讨数据通过深度网络传输…

UE 贴地绘制/日历/鼠标光标滚轮位置缩放图片/UMG滚动数据从前后添加新UI/多图片批量下载 收费项目源码资源

基本里面的内容本人CSDN发的都有现成代码.里面大部分是功能实现思路.这里面是把这几个功能合成了一个完整5.1项目源码.拿到即用.收费项目源码资源. 1.贴地绘制 2.日历 3.鼠标光标滚轮位置缩放图片 \ 4.UMG滚动数据从前后添加新UI思路 5.多图片批量下载 这是整合的懒人源码包收…

Rocky Linux 运维工具yum

一、yum的简介 ​​yum​是用于在基于RPM包管理系统的包管理工具。用户可以通过 ​yum​来搜索、安装、更新和删除软件包&#xff0c;自动处理依赖关系&#xff0c;方便快捷地管理系统上的软件。 二、yum的参数说明 1、install 用于在系统的上安装一个或多个软件包 2、seach 用…