首页 > 其他分享 >Flask_01

Flask_01

时间:2024-02-27 15:33:33浏览次数:24  
标签:__ 01 Flask app flask import --

# 1 下载中间件和爬虫中间件
-爬虫中间件---》控制输入输出---》一般不用
# 2 下载中间件
-process_request:request对象,请求头,请求地址。。
-process_response:response
# 3 修改请求头,加入cookie,加入referer,加入请求头,加代理:request.meta['proxy']

# 4 集成selenium---》性能低
-js
-HtmlResponse
类属性---》类调用--》对象也可以调用

# 5 源码去重规则
-在调度器 schudler中---》enqueue_request---》去重类对象[配置文件中配置RFPDupeFilter]的request_seen---》内部用了指纹(fingerprint)-->get参数一样是一个地址,post,body不一样不是一个请求---》使用了集合

# 6 布隆过滤器
-是什么?
是一个通过多哈希函数映射到一张表的数据结构,能够快速的判断一个元素在一个集合内是否存在,具有很好的空间和时间效率
-原理是?
BloomFilter 会开辟一个m位的bitArray(位数组),开始所有数据全部置 0 。当一个元素过来时,通过多个哈希函数(h1,h2,h3....)计算不同的在哈希值,并通过哈希值找到对应的bitArray下标处,将里面的值 0 置为 1,有错误率

-python如何使用:模块
# 7 使用布隆过滤器实现去重

# 8 分布式爬虫
-scrapy-redis和最新scrapy 兼容性有问题
-1 scrapy版本低一点
-2 运行时,先把起始地址,放到redis中,在运行项目
rpush myspider:start_urls https://www.cnblogs.com

flask介绍

# python 界的web框架
-Django:大而全,使用率较高 :https://github.com/django/django
-FastAPI:新项目选择使用它:https://github.com/tiangolo/fastapi
-flask:公司一些小项目使用它:https://github.com/pallets/flask


# flask
0 Flask是一个用Python编写的Web应用框架。它由Armin Ronacher开发,他领导着一个名为Pocco的国际Python爱好者团队。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目

1 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器

2 “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握

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

4 Flask depends on the Werkzeug WSGI toolkit, the Jinja template engine, and the Click CLI toolkit
-Werkzeug WSGI:接收请求 django 中得 wsgiref
-jinja2模板 :渲染模板的 django中得dtl
-Click CLI :命令定制工具 django 的 manage.py runserver/migrate...



# flask fastapi 跟django的不同
-相同点:都python的web框架
-不同点:
django比较全面,web开发中使用到的东西,它都会内置
-orm
-forms组件,表单验证
-模板:dtl
-缓存
-信号
-admin 后台管理。。。
flask小而精,只保留了web开发的核心功能,其他的需要借助于第三方实现
众多第三方,比如orm咱们会用sqlalchemy,peewee。。

fastapi:跟flask相似,只保留了web开发的核心功能,其他的需要借助于第三方实现
-异步框架
-更方便的使用python async 和 await 关键字来实现异步操作

flask 创建和运行

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


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


# 3 快速体验

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服务端)

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

Werkzeug is a comprehensive WSGI web application library. It began as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility libraries.
Werkzeug 是一个综合性 WSGI Web 应用程序库。它最初是 WSGI 应用程序的各种实用程序的简单集合,现已成为最先进的 WSGI 实用程序库之一。

Werkzeug doesn’t enforce any dependencies. It is up to the developer to choose a template engine, database adapter, and even how to handle requests
Werkzeug 不强制执行任何依赖关系。由开发人员选择模板引擎、数据库适配器,甚至如何处理请求

 

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

 


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

# 后期:
测试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 is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax. Then the template is passed data to render the final document
Jinja 是一个快速、富有表现力、可扩展的模板引擎。模板中的特殊占位符允许编写类似于 Python 语法的代码。然后向模板传递数据以渲染最终文档

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

Click CLI

# 1 Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It’s the “Command Line Interface Creation Kit”. It’s highly configurable but comes with sensible defaults out of the box
Click 是一个 Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的【命令行界面】。它是“命令行界面创建工具包”。它具有高度可配置性,但具有开箱即用的合理默认值

# 2  It aims to make the process of writing command line tools quick and fun while also preventing any frustration caused by the inability to implement an intended CLI API
它的目的是使编写命令行工具的过程变得快速而有趣,同时也防止因无法实现预期的 CLI API 而造成的任何挫败感

# 3  Click in three points:
  arbitrary nesting of commands    
  automatic help page generation
  supports 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
 

flask安装

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

#1 安装flask时,会自动安装一些其他模块
    # Werkzeug implements WSGI, the standard Python interface between applications and servers. 运行服务
    # Jinja is a template language that renders the pages your application serves. 模板
    # MarkupSafe comes with Jinja. It escapes untrusted input when rendering templates to avoid injection attacks. 防止xss攻击
    # ItsDangerous securely signs data to ensure its integrity. This is used to protect Flask’s session cookie. cookie加密
    # Click is a framework for writing command line applications. It provides the flask command and allows adding custom management commands. 制定命令
    # Blinker provides support for Signals.  信号
    
    
#2 这些依赖不会自动安装。如果您安装它们,Flask 将检测并使用它们
# python-dotenv enables support for Environment Variables From dotenv when running flask commands.
可以把key和value放到环境变量---》使用这个模块可以操作

# Watchdog provides a faster, more efficient reloader for the development server
flask修改了代码,他会检测到并重新运行---》最新代码

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内置(venv)可以直接创建虚拟环境

Use a virtual environment to manage the dependencies for your project, both in development and in production.
# 在开发和生产中,使用虚拟环境来管理项目的依赖关系

What problem does a virtual environment solve? The more Python projects you have, the more likely it is that you need to work with different versions of Python libraries, or even Python itself. Newer versions of libraries for one project can break compatibility in another project.
# 虚拟环境解决什么问题?您拥有的 Python 项目越多,您就越有可能需要使用不同版本的 Python 库,甚至是 Python 本身。一个项目的较新版本的库可能会破坏另一项目的兼容性。

Virtual environments are independent groups of Python libraries, one for each project. Packages installed for one project will not affect other projects or the operating system’s packages.
# 虚拟环境是一组独立的 Python 库,每个项目对应一个。为一个项目安装的软件包不会影响其他项目或操作系统的软件包

Python comes bundled with the venv module to create virtual environments.
# 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

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

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 == 'lqz' and password == '123':
            # 重定向到百度
            return redirect('https://www.baidu.com')
        else:
            return render_template('login.html', error= '用户名密码错误')


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

 

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/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="[email protected]" 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>

 

标签:__,01,Flask,app,flask,import,--
From: https://www.cnblogs.com/wzh366/p/18036970

相关文章

  • VS2019自带的增强型指令集和自我优化的版本速度比较.
    去年年底把工程项目由VS的2015升级到2019版本,本以为直接配置下运行环境就可以了,但是一编译发现一大堆错误,所有的错误都指向一系列的指令集,比如_mm_exp_ps、_mm_log_ps、_mm_pow_ps等等,后面发现原来从2019版本开始,编译器已经自带了这些常用的函数,所以自己函数和系统的重名了,也......
  • P4563 [JXOI2018] 守卫
    P4563[JXOI2018]守卫更好的阅读体验这道题让我充分认识了我一点不会dp。首先可以预处理一个点能看到的左边的所有点。注意到一个区间一定会选择右端点,设右端点不能看到的所有极长区间为\([l_1,r_1],[l_2,r_2]\dots[l_k,r_k]\),区间\([L,R]\)的答案即为\(1+\sumf_{l_i,r_......
  • 基于Rust的Tile-Based游戏开发杂记(01)导入
    什么是Tile-Based游戏?Tile-based游戏是一种使用tile(译为:瓦片,瓷砖)作为基本构建单位来设计游戏关卡、地图或其他视觉元素的游戏类型。在这样的游戏中,游戏世界的背景、地形、环境等都是由一系列预先定义好的小图片(即tiles)拼接而成的网格状结构。每个tile通常代表一个固定的尺寸区域,......
  • AT_joi2015ho_b (dp思想)
    难度2比较有意思的dp题首先发现这就是将一个环从中间一点一点剥开的过程。其次观察到joi取时右端点减左端点为偶数,ioi取时为奇数,所以一次一次dp即可。看到这种题时,发现有环,就要想到双倍延长再模拟一下题意,手玩一下即可//LUOGU_RID:117752061#include<bits/stdc++.h>using......
  • U329011 trie pi 题解
    花了2d打磨出来的题目,觉得很有意思。先讲点无关的,这道题有两版,但都是对要求的量进行改动。1.第一次要求的是y属性为a与y属性为b的两个节点的路径权值之和,对于要求的这个量,我们设v[i]为i到根节点的权值之和。那么我们先对a,b进行质因数分解,设dcg为a,b分解质因数后最长公共前缀的乘......
  • P10156(dp思想)
    难度2也是比较有意思的一道题。首先发现每个小团体独立,所以对于每个小团体分开直接暴力dp,dp[i][j]表示当前小团体做到第i人,走了j人,然后O(n)转移,加上部分分喜提50pts。为什么要O(n)转移呢,因为我要枚举匹配的两个人然后算贡献。但是对于这种带绝对值的贡献,我们一般都要把绝对值拆掉......
  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......
  • Python flask
    {{变量}}_init_.py这个文件的执行时间package,moduledebug模式、host、portdebug模式:热更新可以在浏览器上面显示错误信息host让别人可以访问自己的电脑url与试图映射urlRESTful风格传参@app.route('/user/<user_id>')#可以指定参数的类......
  • Java流程控制01:用户交互Scanner
    Scanner对象1.Java提供了一个实现程序和人交互的工具类,可以获取用户的输入。Java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入。2.基本语法: 3.通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取欠我们一般需要使用hasNext()......
  • 洛谷题单指南-贪心-P4447 [AHOI2018初中组] 分组
    原题链接:https://www.luogu.com.cn/problem/P4447题意解读:将一个有序的数列,按不重复连续数分成一组,可分成若干组,使得人数最少的组在各种分组方式之中是最大的。解题思路:观察样例说明,有6个测试点的ai​互不相同,因此直接将数据排序,然后连续数分成一组,计算每组数量最少的,即为答案,6......