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

news2024/11/26 13:27:09

目录

安装虚拟环境和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>

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

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

相关文章

Java“牵手”1688图片识别商品接口数据,图片地址识别商品接口,图片识别相似商品接口,1688API申请指南

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

layui实现数据列表的复选框回显

layui版本2.8以上 实现效果如图&#xff1a; <input type"hidden" name"id" id"id" value"{:g_val( id,0)}"> <div id"tableDiv"><table class"layui-hide" id"table_list" lay-filter…

CPSC上月召回案例(2023年7月)

每年的夏末秋初为美国产品热销节日&#xff08;感恩节、万圣节、黑五&#xff09;的备货期&#xff0c;卖家在大量备货的同时&#xff0c;务必保障自身产品通过相关安全测试&#xff0c;以免造成不必要的损失&#xff01; 以下是五祥列举出的上月被CPSC召回产品&#xff0c;作…

技术分享 | LSM,Linux 内核的安全防护盾

计算机安全是一个非常重要的概念和主题&#xff0c;它不仅仅可以保护用户个人信息和资产的安全&#xff0c;还可以影响到用户在使用过程中的体验&#xff1b;但同时&#xff0c;它也是一个很抽象的概念&#xff0c;关于其相关文献和资料不计其数&#xff0c;但它究竟是什么、包…

相机成像原理【二】

文章目录 1、小孔成像的缺陷1.1 引入透镜 2、薄透镜成像原理2.1 薄透镜工作原理2.2 光线穿过透镜如何前进2.3 光线追踪 3、薄透镜成像公式3.1 高斯成像公式3.2 物距、像距、放大率之间特殊的关系 4、透镜成像特性4.1 对焦4.2 景深 1、小孔成像的缺陷 小孔尺寸过小&#xff0c;图…

iBooker 技术评论 20230831

一、轻资产项目的五类分类 轻资产项目不需要投资&#xff0c;但也不是所有人都做得了&#xff0c;取决于个人认知和能力水平限制。 就好比以前的各科题目&#xff0c;你也不是都能做吧&#xff1f; 我以前刷题的时候&#xff0c;喜欢把题目按照难易程度分五类。现在做项目和…

【python爬虫】11.让爬虫按时向你汇报

文章目录 前言定时与邮件明确目标分析过程爬虫发送邮件定时 代码组装复习 前言 上一关我们学习了selenium&#xff0c;它有可视模式与静默模式这两种浏览器的设置方法&#xff0c;二者各有优势。 然后学习了使用.get(‘URL’)获取数据&#xff0c;以及解析与提取数据的方法。…

【校招VIP】java语言考点之关键字static

考点介绍&#xff1a; static考点是面试的高频考点&#xff0c;一般从容易到难提问&#xff0c;比如从static的含义和理解、到JVM的存储或者到线程安全性&#xff0c;再到单例模式等。 java语言考点之关键字static 相关题目及解析内容可点击文章末尾链接查看&#xff01; 一…

Leetcode1090. 受标签影响的最大值

思路&#xff1a;根据值从大到小排序&#xff0c;然后在加的时候判断是否达到标签上限即可&#xff0c;一开始想用字典做&#xff0c;但是题目说是集合却连续出现两个8&#xff0c;因此使用元组SortedList进行解决 class Solution:def largestValsFromLabels(self, values: li…

Windows docker desktop 基于HyperV的镜像文件迁移到D盘

Docker desktop的HyperV镜像文件&#xff0c;默认是在C盘下 C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx如果部署的软件较多&#xff0c;文件较大&#xff0c;或者产生日志&#xff0c;甚至数据等&#xff0c;这将会使此文件越来越大&#xff0c;容易导致C盘空间…

ChatGPT AIGC 完成二八分析柏拉图的制作案例

我们先让ChatGPT来总结一下二八分析柏拉图的好处与优点 同样ChatGPT 也可以帮我们来实现柏拉图的制作。 效果如下: 这样的按年份进行选择的柏拉图使用前端可视化的技术就可以实现。 如HTML,JS,Echarts等,但是代码可以让ChatGPT来做,生成。 在ChatGPT中给它一个Prompt …

Markdown Preview Plus Chrome插件使用

Markdown Preview Plus Chrome插件使用 1.插件说明2.插件下载3.插件配置4.文档样式4.1 网页显示4.2 导出PDF 系统&#xff1a;Win10 Chrome&#xff1a;113.0.5672.127 Markdown Preview Plus&#xff1a;0.7.3 1.插件说明 一般 markdown 工具自带的预览功能比较简单&#xff…

Java中支持分库分表的框架/组件/中间件简介

文章目录 1 sharding-jdbc2 TSharding3 Atlas4 Cobar5 MyCAT6 TDDL7 Vitess 列举一些比较常见的&#xff0c;简单介绍一下&#xff1a; sharding-jdbc&#xff08;当当&#xff09; TSharding&#xff08;蘑菇街&#xff09; Atlas&#xff08;奇虎360&#xff09; Cobar&#…

【C51基础实验 LED流水灯】

51单片机项目基础篇 LED流水灯1、硬件电路设计和原理分析2、软件设计2.1、利用循环和移位操作符功能实现&#xff1a;LED流水灯2.2、利用利用封装好的库函数功能实现&#xff1a;LED流水灯 3、编译结果4、结束语 LED流水灯 前言&#xff1a; 前几篇学会了LED驱动原理&#xff…

Nano编辑器安装使用指南

关于nano Nano编辑器是一个命令行文本编辑器&#xff0c;具有简单易用的界面和一些基本功能。 Nano小巧友好&#xff0c;提供许多额外的特性&#xff0c;例如交互式的查找和替换、定位到指定的行列、自动缩进、特性切换、国际化支持、文件名标记完成等。 Nano是为了代替闭源的…

Benchmarking Chinese Text Recognition: Datasets, Baselines| OCR 中文数据集【论文翻译】

基础信息如下 https://arxiv.org/pdf/2112.15093.pdfhttps://github.com/FudanVI/benchmarking-chinese-text-recognition Abstract 深度学习蓬勃发展的局面见证了近年来文本识别领域的迅速发展。然而&#xff0c;现有的文本识别方法主要针对英文文本。作为另一种广泛使用的语…

携程 2024秋招内推 火热进行中!

携程 2024秋招 内推火热进行中&#xff01;~ 公司简介:携程校园招聘是为携程集团招募和培养未来的技术专家、业务骨干、管理人员的培训生成长项目。进入携程后&#xff0c;公司会为每位培训生量身拟定双轨四维驱动培养计划&#xff0c; 施行双通道成长模式&#xff0c;可自由选…

【Linux操作系统】信号量实现生生产者消费者模型

当涉及到多线程编程时&#xff0c;经常会遇到生产者消费者问题。在Linux系统编程中&#xff0c;我们可以使用信号量来实现生产者消费者模型&#xff0c;以确保线程之间的同步和互斥。 文章目录 什么是生产者消费者问题&#xff1f;使用信号量实现生产者消费者模型信号量的原理信…

Yao框架浏览器打开后Cannot read properties of undefined (reading ‘search‘)

Yao创建项目后浏览器打开报 undefined 错误&#xff0c;是因为 Yao 框架语言包的问题&#xff0c;只支持浏览器的【中文&#xff08;简体&#xff09;】【英语&#xff08;美国&#xff09;】&#xff0c;如果浏览器排第一的语言不是这两个就会出现这个错误。临时解决方案是在浏…