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_id

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

class 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 = {}
        #验证返回值为True
    if form.validate_on_submit():
        #接收到的name
        data['name'] = form.name.data
        #接收到的password
        data['password'] = form.password.data
    return 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>

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

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

相关文章

利用 AI 赋能云安全,亚马逊云科技的安全技术创新服务不断赋能开发者

文章分享自亚马逊云科技 Community Builder&#xff1a;李少奕 2023年6月14日&#xff0c;一年一度的亚马逊云科技 re:Inforce 全球大会在美国安纳海姆落下了帷幕。re:Inforce 是亚马逊云科技全球最大的盛会之一&#xff0c;汇集了来自全球各地的安全专家&#xff0c;共同学习、…

京东API接口解析,实现获得JD商品评论

要获取京东商品评论&#xff0c;需要使用京东的开放平台API接口。以下是一个基本的示例&#xff0c;解析并实现获取JD商品评论的API接口。 首先&#xff0c;你需要访问京东开放平台并注册一个开发者账号。注册完成后&#xff0c;你需要创建一个应用并获取到API的权限。 在获取…

微服务事务管理(Dubbo)

Seata 是什么 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 一、示例架构说明 可在此查看本示例完整代码地址&#x…

88. 合并两个有序数组

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a; 因为num1只有前m个元素是有效元素&#xff0c;num1和num2有序&#xff0c;所以可以使用双指针进行比较&#xff0c;另外还可以利用num1后半部分可以使用的这…

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…

Vue框架--理解MVVM

我们知道&#xff0c;MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。我们看看MVVM的模型架构&#xff0c;如下所示: 架构理解与实例

基于Matlab实现生活中的图像信号分类(附上源码+数据集)

在我们的日常生活中&#xff0c;我们经常会遇到各种各样的图像信号&#xff0c;例如照片、视频、图标等等。对这些图像信号进行分类和识别对于我们来说是非常有用的。在本文中&#xff0c;我将介绍如何使用Matlab来实现生活中的图像信号分类。 文章目录 介绍源码数据集下载 介…

合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

图表 (Chart) 一幅图胜过一千个字&#xff0c;通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …

Fiddler Response私人订制

在客户端接口的测试中&#xff0c;我们经常会需要模拟各种返回状态或者特定的返回值&#xff0c;常见的是用Fiddler模拟各种请求返回值场景&#xff0c;如重定向AutoResponder、请求拦截修改再下发等等。小编在近期的测试中遇到的一些特殊的请求返回模拟的测试场景&#xff0c;…

Opencv-C++笔记 (18) : 轮廓和凸包

文章目录 一、轮廓findContours发现轮廓drawContours绘制轮廓代码 二.几何及特性概括——凸包(Convex Hull)凸包概念凸包扫描算法介绍——Graham扫描算法 相关API介绍程序示例轮廓集合及特性性概括——轮廓周围绘制矩形框和圆形相关理论介绍轮廓周围绘制矩形 -API绘制步骤程序实…

一台服务器上部署 Redis 伪集群

哈喽大家好&#xff0c;我是咸鱼 今天这篇文章介绍如何在一台服务器&#xff08;以 CentOS 7.9 为例&#xff09;上通过 redis-trib.rb 工具搭建 Redis cluster &#xff08;三主三从&#xff09; redis-trib.rb 是一个基于 Ruby 编写的脚本&#xff0c;其功能涵盖了创建、管…

ExpressLRS开源之接收机固件编译烧录步骤

ExpressLRS开源之接收机固件编译烧录步骤 1. 源由2. 编译步骤2.1 推荐源代码指定方案2.2 方法一&#xff1a;ELRS Configurator步骤一&#xff1a;下载ELRS Configurator工具步骤二&#xff1a;安装ELRS Configurator工具步骤三&#xff1a;使用ELRS Configurator工具进行配置步…

3D点云处理:获取最高层范围内的点(附源码)

文章目录 0. 测试效果1. 基本内容2. 代码实现文章目录:3D视觉个人学习目录微信: dhlddxB站: Non-Stop_目标:仅获取最高层范围内的点云用于后续处理0. 测试效果 红色为提取的最高层范围内的点云 1. 基本内容 要获取点云中特定高度范围内的点云,可以使用高度条件过滤的原理。…

Docker技术--Docker简介和架构

1.Docker简介 (1).引入 我们之前学习了EXSI&#xff0c;对于虚拟化技术有所了解&#xff0c;但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷:所占用的资源比较多&#xff0c;简单的说&#xff0c;就是你需要给每一个用户提供一个操作平台&#xff0c;这一个…

【数据结构】 二叉树面试题讲解->贰

文章目录 &#x1f30f;引言&#x1f384;[二叉树遍历](https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking)&#x1f431;‍&#x1f464;题目描述&#…

【Flutter】下载安装Flutter并使用学习dart语言

前言 安装flutter, 并使用flutter内置的dartSDK学习使用dart语言。 编辑器&#xff1a; Android Studio fluuter 版本 : flutter_windows_3.13.1 内置dartSDK : 3.1.0 dart路径路径&#xff1a; flutter安装路径\bin\cache\dart-sdk 安装Flutter 下载安装包 flutter下载地址…

智慧工地源码 智慧大屏、手机APP、SaaS模式

一、智慧工地可以通过安全八要素来提升安全保障&#xff0c;具体措施包括&#xff1a; 1.安全管理制度&#xff1a;建立科学完善的安全管理制度&#xff0c;包括安全标准规范、安全生产手册等&#xff0c;明确各项安全管理职责和要求。 2.安全培训教育&#xff1a;对工地人…

MySQL数据库——多表查询(3)-自连接、联合查询、子查询

目录 自连接 查询语法 自连接演示 联合查询 查询语法 子查询 介绍 标量子查询 列子查询 行子查询 表子查询 自连接 通过前面的学习&#xff0c;我们对于连接已经有了一定的理解。而自连接&#xff0c;通俗地去理解就是自己连接自己&#xff0c;即一张表查询多次。…

Qt/C++编写视频监控系统81-Onvif报警抓图和录像并回放

一、前言 视频监控系统中的图文警情模块&#xff0c;是通过Onvif协议的事件订阅拿到的&#xff0c;通过事件订阅后&#xff0c;设备的各种报警事件比如入侵报警/遮挡报警/越界报警/开关量报警等&#xff0c;触发后都会主动往订阅者发送&#xff0c;而且一般都是会发送两次&…

【C++】C++11新特性(下)

上篇文章&#xff08;C11的新特性&#xff08;上&#xff09;&#xff09;我们讲述了C11中的部分重要特性。本篇接着上篇文章进行讲解。本篇文章主要进行讲解&#xff1a;完美转发、新类的功能、可变参数模板、lambda 表达式、包装器。希望本篇文章会对你有所帮助。 文章目录 一…