20. python从入门到精通——Flask框架

目录

安装虚拟环境和Flask

第一个Flask程序

Flask的调试模式

路由

变量规则:当在页面中输出变量的时候就需要遵循变量的规则

构造URL

在route函数中设置http方法

获取静态文件路径

蓝图

模板

Web表单

CSRF


安装虚拟环境和Flask

Flask框架主要依赖两个库:

        Werkzeug:它是一个WSGI的工具集

        Jinja2:负责渲染模板

安装方式:使用Flask之前需要安装这两个库,最简单的安装方式是通过virtualenv创建虚拟环境

为啥安装虚拟环境:

        一个服务器上可能有多个项目,每个项目所依赖的外部开发包和版本各不相同,这样就会导致冲突,虚拟环境可以起到隔离的作用

创建虚拟环境:cmd命令行执行

        pip install virtualenv  #安装virtualenv

        virtualenv --version  #查看是否安装成功

        mkdir Flask  #在项目路径下创建文件夹

        cd  Flask

        virtualenv  venv  #在Flask文件夹下创建名为venv的虚拟环境

        venv\Scripts\activate  #进入虚拟环境,注意没有空格

        pip list #查看虚拟环境中包含的包 

        pip install flask  安装flask

        pip list

第一个Flask程序

示例

from flask import Flask
#--name--:应用的名称或包的名称
app = Flask(__name__)#用装饰器的方式定义路由:比如我们访问一个URL结尾是'/',那么Flask会自动匹配到hello这个方法
@app.route('/')
def hello():return "hello word 你好 !"if __name__ == "__main__":#运行服务并开启调试模式app.run(debug=True)

测试:

        终端运行此文件

        浏览器访问: http://127.0.0.1:5000/

Flask的调试模式

        在运行服务代码中加上debug=True就会开启调试模式

        调试模式:在没有开启调试模式的情况下每次修改代码都需要重新启动一下服务才能读取到修改后的运行结果,可以开启调试模式解决这个问题

        开启调试模式有两种方法:

            在参数中添加:

                app.run(debug=True)  

            在参数外添加:

                app.debug = True

                app.run()

路由

路由:URL 与python函数的映射关系

示例:定义两个URL映射的路由

from flask import Flask
#--name--:应用的名称或包的名称
app = Flask(__name__)#用装饰器的方式定义路由:比如我们访问一个URL结尾是'/',那么Flask会自动匹配到hello这个方法
@app.route('/')
def hello():return "hello word 你好 !"@app.route('/test')
def test():return "this is test"if __name__ == "__main__":#运行服务app.run(debug=True)

验证:

        http://127.0.0.1:5000/test        

        http://127.0.0.1:5000/

变量规则:当在页面中输出变量的时候就需要遵循变量的规则

        

用法: 

        <converter:variable_name> #类型名称:变量名称

示例

from flask import Flask
#--name--:应用的名称或包的名称
app = Flask(__name__)#用装饰器的方式定义路由,设置变量
@app.route('/user/<username>')
def show_user(username):return "user:%s" % username#用装饰器的方式定义路由,设置变量并限制类型
@app.route('/post/<int:post_id>')
def show_id(post_id):return "post:%s" % post_idif __name__ == "__main__":#运行服务app.run(debug=True)

测试:

        http://127.0.0.1:5000/user/lisi

        http://127.0.0.1:5000/post/521

构造URL

用法:

        url_for(endpoint,**values)

示例:

from flask import Flask ,url_for
#--name--:应用的名称或包的名称
app = Flask(__name__)@app.route('/post/<int:post_id>')
def show_id(post_id):return "post:%s" % post_id@app.route('/url/')
def get_url():#url_for函数可以获取show_id函数的url并添加参数return url_for('show_id',post_id=2)if __name__ == "__main__":#运行服务app.run(debug=True)

测试:

        http://127.0.0.1:5000/url/

在route函数中设置http方法

例:

@app.route('/url/',methods=['POST','GET','PUT'])

获取静态文件路径

示例

@app.route('/url/')
def get_url():#url_for函数可以获取static目录下路径为css/style.css文件的路径return url_for('static',filename='css/style.css')

测试:

        http://127.0.0.1:5000/url

结果: /static/css/style.css

蓝图

蓝图:是组织一组相关视图和代码的方式

需求背景:如果要实现一个项目将所有的代码写在一个文件中的方式肯定是不行的,就需要重新组织文件结构,通常会创建三个文件:views(用于存放路由及其对应的函数)、models(用于存放操作数据库相关的内容)、templates(用于存放模板文件相关的内容)。但是随着项目继续扩大,例如用户功能、商城功能等每个功能都需要这三个文件。如果将他们全部写在一起,那么项目又会变得非常的冗杂。针对这种情况在Flask中提出了蓝图的概念。

作用:使用蓝图可以重构项目的目录结构

使用:在App应用下创建多个蓝图,然后将多个蓝图注册到App应用中,接下来我们就可以使用每一个蓝图管理其对应的 views、models、template

创建蓝图对象:

        bp = Blueprint('admin',__name__,url_prefix='/admin')

                #Blueprint:flask中的模块

                #admin:蓝图的名称

                #__name__:所指向的模块名称,如果单独运行这个文件的话他就是__main__

                #url_prefix:表示URL的前缀

注册蓝图:

        app.register_blueprint(bp)

模板

模板:就是包含一个响应文本的文件,在这个文件中会用变量表示一些动态的部分

渲染:使用真实的值替换变量这个过程就叫渲染。为了渲染模板flask使用了一个非常强大的模板引擎叫做 Jinja2

在模板中同样也可以使用if、for等流程的控制语句

示例:用变量显示用户名

在Flask项目创建模板文件目录 templates,flask会默认找到这个文件夹

创建两个模板文件:通常都使用html文件,因为浏览器可以自动解析它

        index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>Hello Word</h1>
</body>
</html>

        user.html:由于flask中默认使用了Jinja2模板,所以可以使用模板的方式创建一个变量:
 {{ name }} ,然后用真是的值替换这个name,这个过程就叫渲染

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><h1>Hello, {{ name }}!</h1></body>
</html>

py文件代码:

from flask import Flask,render_template
app = Flask(__name__)@app.route('/')
def hello_world():return render_template('index.html')#传递参数username
@app.route('/user/<username>')#接受参数username
def show_user_profile(username):# 显示该用户名的用户信息              向user.html中传参  return render_template('user.html', name=username)if __name__ == '__main__':app.run(debug=True)

测试:

        http://127.0.0.1:5000/        

        http://127.0.0.1:5000/user/张三

Web表单

大部分应用都需要从用户方获取信息,这样才能实现与用户之间的交互。表单是允许用户跟web应用交互的基本元素

CSRF

CSRF保护与验证(跨站请求伪造):通过第三方伪造表单数据,以post方式提交到应用服务器

Flask-WTF:判断一个post请求是否来自自己的网站表单,使用它在渲染表单时会生成一个独一无二的token。这个令牌在post请求时随着表单数据一起传递给后台,并且在表单被接收之前验证。token的值取决于存储在用户的会话中的一个值,并且会在一定时间之后失效,默认为30分钟。这样只有登录了页面的用户才能提交一个有效的表单,而且是在登录页面的30分钟之内 

安装: pip install flask-wtf   #依赖WTForms

WTForms支持的HTML标准字段

WTForms内置对这些字段验证函数

实例:实现登录验证功能

py代码

from flask import Flask , render_template
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField,SubmitField
#引入必填字段规则
from wtforms.validators import Requiredclass LoginForm(FlaskForm):name = StringField(label='用户名', validators=[Required("用户名不能为空")])password = PasswordField(label='密 码', validators=[Required("密码不能为空")])submit = SubmitField(label="提交")app = Flask(__name__)#配置flask-wtf 
app.config['SECRET_KEY'] = 'mrsoft'@app.route('/', methods=['GET', 'POST'])
def index():form = LoginForm()data = {}#验证返回值为Trueif form.validate_on_submit():#接收到的namedata['name'] = form.name.data#接收到的passworddata['password'] = form.password.datareturn render_template('index.html', form=form,data=data)if __name__ == '__main__':app.run(debug=True)    

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
</head>
<body><div class="container"><h1>Hello World!</h1><form action="" method="post" novalidate><div>{{ form.name.label }}{{ form.name }}</div><!-- form.name.error是一个错误集合,通过for语句显示所有错误信息 -->{% for err in form.name.errors %}<div class="col-md-12"><p style="color: red">{{ err }}</p></div>{% endfor %}<div>{{ form.password.label }}{{ form.password }}{% for err in form.password.errors %}<div><p style="color: red">{{ err }}</p></div>{% endfor %}</div><!-- 生成一个token,token验证由flask自动处理 -->{{ form.csrf_token }}{{ form.submit }}</form>{% if data  %}您输入的用户名为:{{ data['name'] }}<br>您输入的密码为:{{ data['password'] }}{% endif %}</div>
</body>
</html>

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

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

相关文章

小白学Go 基础02-了解Go语言的诞生与演进

Go语言诞生于何时&#xff1f;它的最初设计者是谁&#xff1f;它为什么被命名为Go&#xff1f;它的设计目标是什么&#xff1f;它如今发展得怎么样&#xff1f;带着这些问题&#xff0c;我们一起穿越时空&#xff0c;回到2007年9月Go语言诞生的那一历史时刻吧。 Go语言的诞生 …

C# 如何将使用的Dll嵌入到.exe应用程序中?

文章目录 前言详细实操简要步骤 前言 有没有想自己开发的exe保留一点神秘&#xff0c;不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了&#xff0c;能不能简单一点&#xff0c;直接双击.exe就可以直接运行了&#xff0c;别搞那么多乱七八糟的。…

【Datawhale】AI夏令营第三期——基于论文摘要的文本分类笔记(上)

暑期参加了Datawhale的第三期AI夏令营&#xff0c;学习的是NLP方向&#xff0c;在此期间&#xff0c;我们通过比赛打榜的形式进行NLP的学习。今天&#xff0c;主要分享和记录一下这一期夏令营的学习历程和笔记。 文章目录 赛题背景赛题任务赛题数据集评价指标解题思路任务一&am…

linux中学习控制进程的要点

1. 进程创建 1.1 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核会做以下操作 分配新的内存块和…

Java“牵手”京东商品列表数据,关键词搜索京东商品数据接口,京东API申请指南

京东商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取京东商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问京东商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

ShardingSphere——压测实战

摘要 Apache ShardingSphere 关注于全链路压测场景下&#xff0c;数据库层面的解决方案。 将压测数据自动路由至用户指定的数据库&#xff0c;是 Apache ShardingSphere 影子库模块的主要设计目标。 一、压测背景 在基于微服务的分布式应用架构下&#xff0c;业务需要多个服…

13.动态渲染侧边栏

为什么要动态渲染&#xff1f; 比如我们现在需要以下侧边栏的数据&#xff1a; 如果一个个的去写标签会很麻烦&#xff0c;发现导航栏中的数据分为两类&#xff0c;一类是一级导航&#xff0c;另一位是二级导航&#xff08;有子页&#xff09;&#xff0c;因此直接写两个函数判…

SpringCluod深入教程

1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#…

环保环卫行业案例 | 燕千云助力高能环境搭建数智化IT服务管理体系及平台

当前环境卫生问题在全球已引起前所未有的关注&#xff0c;而促进健康又成为环境与发展所关注的核心问题。随着数字化时代的到来&#xff0c;环保环卫行业呈现出多个发展趋势&#xff0c;随着业务系统规模的不断扩大&#xff0c;信息系统的运维问题也日益突出&#xff0c;需要得…

2023年新型智慧城市顶层设计规划解决方案86页[PPT]

导读:原文《2023年新型智慧城市顶层设计规划解决方案86页[PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 内容简介 智慧城市顶层设计&整体架构 技术实施层-基础设施 农业产业互联网概述 智慧农业-解决方…

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录 1、观察者模式&#xff08;Observer Pattern&#xff09;含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现观察者模式的实例 1、观察者模式&…

Modbus通信协议

Modbus通信协议 一、概述 Modbus通信协议是一种工业现场总线协议标准&#xff0c;常用的Modbus协议有以下三种类型&#xff1a;Modbus TCP、Modbus RTU、Modbus ASCll。 Modbus通信协议解决了通过串行线路在电子设备之间发送信息的问题。该协议在遵循该协议的体系结构中实现主…

本地虚机Jumpserver使用域名访问报错 使用IP+端口没有错误

背景&#xff1a; 我在本地Windows VMware 15的环境中部署了CentOS7.5&#xff0c;下载jumpserver-offline-installer-v2.28.1-amd64-138.tar.gz并安装部署。 需求&#xff1a; 1、能使用http:ip访问堡垒机。达成&#xff1b; 2、能使用http:域名访问堡垒机。达成&#xff…

基于大语言模型知识问答应用落地实践 – 知识库构建(下)

上篇介绍了构建知识库的大体流程和一些优化经验细节&#xff0c;但并没有结合一个具体的场景给出更细节的实战经验以及相关的一些 benchmark 等&#xff0c;所以本文将会切入到一个具体场景进行讨论。 目标场景&#xff1a;对于 PubMed 医疗学术数据中的 1w 篇文章进行知识库构…

c++(8.29)auto关键字,lambda表达式,数据类型转换,标准模板库,list,文件操作+Xmind

作业&#xff1a; 封装一个学生的类&#xff0c;定义一个学生这样类的vector容器, 里面存放学生对象&#xff08;至少3个&#xff09; 再把该容器中的对象&#xff0c;保存到文件中。 再把这些学生从文件中读取出来&#xff0c;放入另一个容器中并且遍历输出该容器里的学生。…

CSS transition 过渡

1 前言 CSS过渡(transition)可以在一个元素切换到另一种状态时为其定义平滑的过渡效果。 例如&#xff0c;用户鼠标悬停在按钮上时&#xff0c;按钮颜色平滑的从一个颜色过渡到另一个颜色。 .btn:hover{background-color: red;color: black; }默认悬停效果 添加过渡效果 .b…

网工内推 | 上市公司,IT工程师、服务器工程师,IP以上优先

01 烟台睿创微纳技术股份有限公司 招聘岗位&#xff1a;IT工程师 职责描述&#xff1a; 1、负责网络及安全架构的规划、设计、性能优化&#xff1b; 2、负责网络设备的安装、配置、管理、排错、维护&#xff0c;提供网络设备维护方案&#xff1b; 3、负责防火墙、上网行为管理…

滑动窗口和双指针

滑动窗口和双指针 一、循环不变量1.1 定义1.2 总结 二、使用循环不变量写对代码2.1 注意2.2 总结 三、滑动窗口3.1 固定长度的滑动窗口&#xff08;同向交替移动的两个变量&#xff09;3.2 不定长度的滑动窗口3.2.1 定义3.2.2 总结 3.3 计数问题3.3.1 标准3.3.2 总结 3.4 使用数…

前端基础4——jQuery

文章目录 一、基本了解1.1 导入jQuery库1.2 基本语法1.3 选择器 二、操作HTML2.1 隐藏和显示元素2.2 获取与设置内容2.3 获取、设置和删除属性2.4 添加元素2.5 删除元素2.6 设置CSS样式 三、jQuery Ajax3.1 基本语法3.2 回调函数3.3 常用HTTP方法3.4 案例一3.4.1 准备工作3.4.2…