Flask的使用

2023-11-16

1.创建项目

利用python的包安装工具pip下载wheel

pip3 install flask

查看当前项目的环境

pip3 list

1.2 项目构造

  • static
  • templates
  • app.py

mtv:

  • model
  • template
  • view

1.3 完成app.py

app.py是启动项目的main方法,我们需要在里面声明flask的启动函数。

from flask import Flask
app=Flask(import_name)
@app.route("/")
def hello():
    return "hello world";
app.run()

1.4 wsgi

就是说python提供了很多web架构,但是这些架构没有统一的和web server进行连接的接口,而wsgi做的就是统一规则的接口,python代码根据wsgi接口将内容放到web server上。

1.5 config

app.config包含了flask的配置内容,他被存到一个集合当中。

Config {'ENV': 'development', 'DEBUG': True, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': None, 'JSON_SORT_KEYS': None, 'JSONIFY_PRETTYPRINT_REGULAR': None, 'JSONIFY_MIMETYPE': None, 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093}>

我们可以直接在app.py里面改变他,但为了项目的解耦,我们要把他从主程序中拆离。

#settings file
ENV='development'
DEBUG=True
app.config.from_object(settings)

2.路由

route就像vue一样,规定路线。

@app.route("/")
def index(){
    return "首页";
}
@app.route("/book/{}")
def get(){
    return "book";
}

2.1 request

当我们在浏览器输入 {域名:端口/index},此时就会访问服务器,服务器会去寻找是否拥有index这个路由,有的话就执行路由匹配的函数。

请求行:网址

请求体:

Accept /
Accept-Encoding gzip, deflate, br
Accept-Language zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection keep-alive
Cookie BAIDUID=9AABC37B82F1D6576D21D03DA8C82C01:FG=1; BIDUPSID=9AABC37
Host passport.baidu.com
Referer https://www.baidu.com/index.php?tn=monline_3_dg
Sec-Fetch-Dest script
Sec-Fetch-Mode no-cors
Sec-Fetch-Site same-site
User-Agent Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0

请求头: get看不到

2.1.2 request使用

    print(request.path)
    print(request.base_url)
    print(request.url)
    print(request.endpoint)

获取请求体

#post
request.form[''] or request.form.get()
#get
request.args[''] or request.args.get()

2.2 response

响应行:状态码

  1. 200 成功
  2. 300 重定向
  3. 400 客户端错误,无法响应你的请求
  4. 500服务器错误,无法读取你需要的响应

响应头,就是服务器在收到你的请求后做出的响应。

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/x-javascript
Date: Wed, 12 Apr 2023 12:45:58 GMT
Etag: W/“643623bb-1ad1”
Last-Modified: Wed, 12 Apr 2023 03:21:31 GMT
Server: BWS
Strict-Transport-Security: max-age=31536000
Tracecode: 31616162650240030218041220
Vary: Accept-Encoding
Transfer-Encoding: chunked

响应体:就是你要收到的内容

flask里面的response类就是我们所返回的类型,我们将内容写好后,会传入一个response中进行打包返回给客户端。

2.3.1 make_response

我们可以自己新建一个response,他拥有和本身我们return所赋予的response一样,我们可以给响应头加东西,当我们想返回的时候还想加入返回头。

response=make_response(content)
response.headres['xxx']='xxx'
print(response.response)
print(response.headers)
return response
#这个返回的就是response instance

2.3 底层

app.route本质上还是实现了add_url_rule函数,在这里面包含route,view-func,options,endpoints参数。

def decorator(f: T_route) -> T_route:
    endpoint = options.pop("endpoint", None)
    self.add_url_rule(rule, endpoint, f, **options)
    return f
  1. route就是url映射规则。
  2. view_func是要配对的函数
  3. options就是你的一些设置
  4. endpoints

2.4 变量规则

可以利用,利用放入key,从data字典里面拿值。

data = {"a": "北京", "b": "上海", "c": "东京"}


@app.route("/city/<key>")
def getCity(key):
    return data.get(key)

请求可以规定类型:

string (缺省值) 接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串

返回类型:

string 字符类型,text/html
dict 字典,默认读取成application/json
tuple unpack,内容,status code
response instance response实例
status 状态类型,为int

2.5 重定向

本质上就是将response的响应码使用重定向,在response的headers中加入location告诉客户端进行重定向。

#flask封装方法
redirect(location,code,response)

#利用定义实现
def show():
    response = make_response("sdfsdf")
    response.status_code = 302
    response.location = "http://localhost:8080/get"
    return response

2.6 url_for

url_for是放进去一个endpoint也就是方法名,他会获取到他的url表示,这样我们可以快速锁定到他的位置。

#意思是重定向到get这个函数的url上
def show():
    return redirect(app.url_for("get"))

3. 模板

flask使用的是jinjia模板,我们使用起来,遵照jinjia的模板使用方法。jinjia相比于java的thymeleaf,只能用臭来形容。

3.1 模板传值

将python的内容传送给template

#var就是放参数的地方,用命名参数的方法填写
render_template(template,user=user,cmc='shuaige')

3.2 控制块

for循环

{%for i in student%} #转义符
{endfor}

if循环

{%if statement%}
html
{%else%}
html
{%endif%}

3.3 loop

loop变量可以当index使用

{{loop.index}} #代表从1开始的序号,

{{loop.index0}} #代表从0开始
{{loop.revindex}} #降序倒着来
{{loop.revindex0}}#降序倒着来,到0
{{loop.first}} #是否是第一个 返回bool
{{loop.last}} #是否是最后一个

3.4 过滤器

过滤器就是函数的方法,属性,在模板中使用后端代码的地方。

{{变量|属性}}

3.4.1 转义

{{user|safe}} //转义字符,可以识别出是否是html体

3.4.2 首字母大写

{{user|capitalize}}

3.4.3 title

每一行大写

3.4.4 reverse

翻转

3.4.5 format

{{“%s is %d years old.”|format(1,2)}

3.4.6 truncate

截断

{{"hello world"|truncate(5)|reverse}}

3.5 列表过滤器

sum
{{count|sum}} //用于整形
sort

排序

获取列表字典

{%for user in users%}
{%for k,v in user|items%}
{{k}}->{{v}}
{%endfor%}
{%endfor%}

3.6 自定义过滤器

def xxx():
app.add_template_filter(xxx,'xxx') #手动塞入
#装饰器形式
@app.template_filter('xxx')
def xxx():

3.7 模板继承

导入basic.html

{%extends 'basic.html'%}

想要改变里面的内容需要block进行改变,在basic.html里面有block。

    {%block middle%}
    {%endblock%}

直接添加,不像上面是继承父类文件,在写入子类

{%include 'header.html'%}

3.8 静态文件

我们根据app.url_map可以看到flask为我们准备了static,我们在服务器上获取内容,使用绝对定位是一种不负责任的手法。

[<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>

使用url_for(‘static’,filename=‘’)

{%url_for('static',filename='xlkj')%}

———————

4 发送文件

flask提供给了我们将response-type改成文件类型的发送方法,我们可以不自己更改Response对象了。
在这里插入图片描述
这里他说需要使用一个BytesIo进行二进制流的接收,进行发送

@user_bp.route("/get_captcha",methods=['get'])
def get_captcha():
    captcha = create_captcha(length=4)
    img_io = BytesIO()
    captcha.save(img_io, 'PNG')
    img_io.seek(0)
    return send_file(img_io, mimetype='image/png')

如果你不想使用flask自带的,那你就需要使用make_resposne进行自己的创建。

@user_bp.route("/get_captcha",methods=['get'])
def get_captcha():
    captcha = create_captcha(length=4)
    img_io = BytesIO()
    captcha.save(img_io, 'PNG')
    img_io.seek(0)
    response = make_response(img_io)
    response.headers['Content-Type']='image/png'
    return response

5 flash

flask为我们提供了快速返回前端内容,他将内容保存到session中,在前端通过使用全局函数**get_flashed_messages()**获取消息并将它显示出来。

@home_bp.route("/", methods=['get', 'post'])
def home_center():
flash("欢迎来到主页!!")
    return render_template("index.html")

通过这个方法遍历,他会返回一个list[str]

        {% for message in get_flashed_messages() %}
            {{ message }}
        {% endfor %}

他有三个类型
1.info
2.warning
3.error

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask的使用 的相关文章

  • 将tensorflow 2.0 BatchDataset转换为numpy数组

    我有这个代码 train images test images tf keras datasets mnist load data train dataset tf data Dataset from tensor slices train
  • 在 Python 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • on_delete=models.PROTECT 和 on_delete=models.CASCADE 在 Django 模型上有什么作用?

    我对 Django 很熟悉 但最近注意到有一个on delete models CASCADE and on delete models PROTECT模型的选项 on delete models CASCADE and on delete
  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • matplotlib matshow 标签

    我一个月前开始使用 matplotlib 所以我仍在学习 我正在尝试用 matshow 制作热图 我的代码如下 data numpy array a reshape 4 4 cax ax matshow data interpolation
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • Airflow Python 单元测试?

    我想为我们的 DAG 添加一些单元测试 但找不到任何单元测试 有 DAG 单元测试框架吗 有一个端到端的测试框架存在 但我猜它已经死了 https issues apache org jira browse AIRFLOW 79 https
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • 如何通过字符串匹配加速 pandas 行过滤?

    我经常需要过滤 pandas 数据框df by df df col name string value 并且我想加快行选择操作 有没有快速的方法可以做到这一点 例如 In 1 df mul df 3000 2000 3 reset inde
  • 张量流:注册 numpy bfloat16 扩展

    正如我所见 tensorflow 中有 bfloat16 的 numpy 扩展 https github com tensorflow tensorflow blob 24ffe9f729160a095a5cab8f592392018280
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • TypeError:无法使用抽象方法实例化抽象类 <...>

    这是我的代码 from abc import ABC from abc import abstractmethod class Mamifiero ABC docstring for Mamifiero def init self self

随机推荐

  • "1,2;3,4,5;6,7,8,9" 转换成[1,2][3,4,5][6,7,8,9]

    1 2 3 4 5 6 7 8 9 转换成 1 2 3 4 5 6 7 8 9 public class Test public static void main String args String s 1 2 3 4 5 6 7 8 9
  • hduoj 2002

    计算球体积 Problem Description 根据输入的半径值 计算球的体积 Input 输入数据有多组 每组占一行 每行包括一个实数 表示球的半径 Output 输出对应的球的体积 对于每组输入数据 输出一行 计算结果保留三位小数
  • Unity报错之【NullReferenceException: Object reference not set to an instance of an object】

    空指针错误 Object并没有作为一个对象的实例 一般都是引用类型的变量没有实例化便使用变量进行一些实例对象才能进行的操作 例如list没有new实例 便对其进行添加元素 private List
  • Python中对文件的常规操作

    文章目录 一 读取文本文件数据 1 1 读文件 r 标识符 1 2 写文件 w操作 1 3 写文件 write only a操作 1 4 r 操作 1 5 w 操作 1 6 a 操作 二 读取非纯文本数据 三 指针的变化 四 上下文管理器
  • web漏洞类型概述(owasp top10笔记)

    一 owasp top10是什么 OWASP 开放式Web应用程序安全项目 OWASP Open Web Application Security Project 是一个非营利组织 不附属于任何企业或财团 它提供有关计算机和互联网应用程序的
  • 基于opencv -python--银行卡识别

    import cv2 def sort contours cnts method left to right reverse False i 0 if method right to left or method bottom to top
  • R 修改安装包默认存放位置的方法

    目录 R语言修改安装包的默认储存位置 查看默认的安装包位置 第一种方法会修改当前用户的R包位置 第二种方法 永久改变 永久有效 第三种方法 修改环境变量 总结 R语言修改安装包的默认储存位置 查看默认的安装包位置 一般会有两个目录 如下 第
  • 计算机操作系统-进程篇

    一 进程 进程 progress 是指计算机中已运行的程序 每个进程都有自己的地址空间 内存 寄存器和堆栈等资源 它们与其他进程相互隔离 互不干扰 进程是操作系统中最基本的资源分配单位 也是操作系统中最重要的概念之一 在操作系统中 进程是由
  • 动态规划:样例讲解一篇通

    概念讲解 动态规划是把大问题分解成子问题 但不能简单的分解 子问题要具有相同子结构的解 并综合子问题的解 导出大问题的解 问题求解耗时会按问题规模呈幂级数增加 基本方法 为了节约重复求相同子问题的时间 引入一个数组 不管它们是否对最终解有用
  • 运行jar包提示 “XXX中没有主清单属性” “找不到主类”两种解决办法

    运行jar包提示 XXX中没有主清单属性 找不到主类 两种解决办法 这种情况一般都是使用maven打成jar包后运行出现的 这种情况是因为jar包里面没有主类路径 解决办法有两个 1 使用IDEA自带的构建jar包流程 不使用Maven打包
  • GPS开源项目

    GPS数据解析开源项目 测试数据 GNRMC 013300 00 A 2240 84105 N 11402 70763 E 0 007 220319 D 69 r n GNVTG T M 0 007 N 0 014 K D 3A r n G
  • C++多态虚函数表详解(多重继承、多继承情况)

    本文关键词 C 多态 多继承 多重继承 虚函数表 虚函数指针 动态绑定 概述 C 相对其他面向对象语言来说 之所以灵活 高效 很大程度的占比在于其多态技术和模板技术 C 虚函数表是支撑C 多态的重要技术 它是C 动态绑定技术的核心 本文章将
  • mavonEditor中的图片上传与删除(前后端交互)

    我设置的存储图片服务器的地址 D Program Files apache tomcat 9 0 43 webapps ROOT newsimg 1 图片上传 1 1 前端 文本上传图片事件处理函数 imgAdd pos file var
  • 一文带你层层解锁「文件下载」的奥秘

    大家好我是秋风 今天带来的主题是关于文件下载 在我之前曾经发过一篇文件上传的文章 一文了解文件上传全过程 1 8w字深度解析 进阶必备 200 点赞 反响还不错 时隔多日 由于最近有研究一些媒体相关的工作 因此打算对下载做一个整理 因此他的
  • Java 将前端传来的数字转化为日期

    由于不知名的原因 前端传来的日期数据被转换成了一串数字 导致入库失败 现需将数字转换为日期格式 代码如下 public class DateTest public static void main String args throws Pa
  • Linux touch 命令指南大全

    1 概述 在本教程中 我们将学习touch命令 简而言之 这个命令允许我们更新文件或目录的最后修改时间和最后访问时间 因此 我们将重点关注如何使用该命令及其各种选项 请注意 我们使用 Bash 测试了此处显示的所有命令 但是 它们应该与任何
  • 手把手教你二进制安装生产环境 K8s 多 master 节点高可用集群详细图文教程

    目录 一 集群环境准备 1 1 kubeadm 和二进制安装 k8s 适用场景分析 1 2 多 master 节点高可用架构图 二 基础环境配置 以下操作所有节点都得执 2 1 初步的环境初始化 2 2 关闭交换分区 swap 提升性能 2
  • Error:Abnormal build process termination: E:\myeclipse\jdk8\jdk\bin\java -Xmx700m -Djava.awt.headle

    解决办法 关闭电脑上面的防火墙就好了
  • Koin--适用于Kotlin的超好用依赖注入框架,Dagger替代者,Koin史上最详细解说,一篇就够了,妈妈再也不用担心我不会依赖注入了

    今年呆在家中实在无聊 外面太危险了 还是在家学习比较安全可持续 过年期间 我又复习了几遍依赖注入框架Dagger 诶 什么是依赖注入 说白了就是降低跟类对象之间的耦合 当需要修改类对象的时候 能不修改被依赖的实例 其实我们平常就用到了很多的
  • Flask的使用

    1 创建项目 利用python的包安装工具pip下载wheel pip3 install flask 查看当前项目的环境 pip3 list 1 2 项目构造 static templates app py mtv model templa