[Flask] 初识Flask

news2024/11/15 20:10:31

Flask是一个使用Python编写的轻量级Web应用框架

为了更好地管理Python应用,通常情况下都会在虚拟环境中安装Flask框架。在虚拟环境下,使用如下命令安装Flask

pip install flask

我们可以直接使用pycharm工具创建虚拟环境,只需要在创建项目的时候勾选创建虚拟环境即可

目录结构

 使用pip install flask命令安装Flask框架

Flask框架安装完成后,就可以开始编写第一个Flask程序

在资源目录下创建一个run.py文件,代码如下所示

# run.py
from flask import Flask
app = Flask(__name__)

# 使用route()装饰器告诉Flask什么样的URL能触发执行被装饰的函数
# index()函数就是被装饰的视图函数,它返回显示在用户浏览器中的信息
@app.route('/')
def index():
    return 'Hello World!'

# 使用run()函数来让应用运行在本地服务器上
# 其中"if __name__ == '__main__':"确保服务器只会在该脚本被Python解释器直接执行的时候才会运行
if __name__ == '__main__':
    app.run()
文件目录结构

运行run.py文件,运行成功后效果如下图所示

然后在浏览器中,输入网址http://127.0.0.1:5000,运行效果如下图所示

按"CTRL + C"组合键就可以关闭服务 

Flask配置

① 开启debug模式

如果我们对代码进行了修改,就得重新启动程序以及加载url,这样显然比较繁琐,此时我们可以启用Flask调试模式解决上述问题

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

我们对上面的run.py文本进行修改,开启debug模式 

# run.py
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello World!'


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

运行run.py文件,运行成功后效果如下图所示

② 设置端口号

if __name__ == '__main__':
    app.run(port=8000)

我们再对上面的run.py文本进行修改,设置端口号为8000

# run.py
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello World!'


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

启动服务后,在浏览器中输入网址http://127.0.0.1:8000,运行效果如下图所示

③ 正确显示中文

# run.py
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
    return {"username":"安迪"}


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

上述代码运行成功后,中文会出现乱码的情况 

如何让其显示为正确的中文呢?

这里我们需要修改配置文件,flask项目的配置都是通过app.config对象来进行配置操作的,显示中文乱码与JSON_AS_ASCII有关,默认为True,这里我们修改为False就可以解决上述中文乱码问题

app.config['JSON_AS_ASCII']=False 

我们对上述代码进行编辑修改 

# run.py
from flask import Flask
app = Flask(__name__)
app.config['JSON_AS_ASCII']=False

@app.route('/')
def index():
    return {"username":"安迪"}


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

结果如下图所示

提示Tips

如果我们需要写的app.config配置过多,可以将所有的配置项都放在一个模块里,然后通过加载模块的方法进行配置 

我们将配置全部写在config文件里,config.py文件内容如下

# config.py
JSON_AS_ASCII=False

run.py文件程序里,我们进行加载模块 

from flask import Flask
import config
app = Flask(__name__)
# 以后所有的配置项,全部放在config.py中
app.config.from_object(config)  # 表示从哪个对象中加载配置,我们把配置写到了config文件里


@app.route('/')
def index():
    return {"username":"安迪"}


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

结果如下图所示

路由

@app.route()函数中添加URL时,这里的URL有时是变化的。例如,商品详情页面的商品ID是变化的,个人中心页面的用户名称是变化的。针对这种情况,可以构造含有动态部分的URL,也可以在一个函数上附着多个规则

要给URL添加变量部分,可以把这些特殊的字段标记为<变量名>的形式,它将会作为命名参数传递到函数。如果要对变量名的类型进行限制,则可以使用<变量类型:变量名>指定一个可选的类型转换器

实例1:根据不同的用户名参数,输出相应的用户信息

# run.py
from flask import Flask
app = Flask(__name__)


# 设置动态URL"/user/<username>",<username>是变化的用户名
@app.route('/user/<username>')
def show_user_profile(username):
    # 显示该用户名的用户信息
    return f'用户名是: {username}'


# 设置动态URL"/post/<post_id>",<post_id>是变化的ID名,并且设置该ID只能为整数
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # 根据ID显示文章,ID是整型类型
    return f'ID是: {post_id}'


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

运行run.py文件,当访问http://127.0.0.1:5000/user/andy时,运行结果如下图所示

 当访问http://127.0.0.1:5000/post/1时,运行结果如下图所示

当访问http://127.0.0.1:5000/post/one时,由于one不是整数,无法匹配该路由,则会提示"Not Found",运行结果如下图所示

一般我们通过一个URL可以执行到某一个函数,如果反过来,我们知道一个函数,怎么去获得这个URL呢?

我们可以使用url_for()函数来给指定的函数构造URL,它的第一个参数是函数名,其余参数会添加到URL末尾作为查询参数

实例2

# run.py
from flask import Flask, url_for, jsonify
app = Flask(__name__)
app.config['JSON_AS_ASCII']=False

books=[
    {"id":1, "name":"三国演义"},
    {"id":2, "name":"水浒传"},
    {"id":3, "name":"红楼梦"},
    {"id":4, "name":"西游记"},
]


@app.route("/book/<int:book_id>")
def book_detail(book_id):
    for book in books:
        if book_id == book["id"]:
            return book
    return "id为{}的图书没有找到".format(book_id)


@app.route("/book/list")
def book_list():
    for book in books:
        book["url"] = url_for("book_detail", book_id=book["id"])
    return jsonify(books)


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

运行run.py文件,当访问http://127.0.0.1:5000/book/list时,运行结果如下图所示

指定HTTP方法 

@app.route()中可以传入一个关键字参数methods来指定支持的HTTP方法,HTTP方法告知服务器,客户端想对请求的页面做些什么

GET和POST方法使用的最多 

@app.route("/book/<int:book_id>",methods=["GET","POST"])

举个例子

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

GET请求和POST请求的区别

如果只是从服务器上获取数据,一般都是GET请求
如果前端需要把数据发送给服务器,一般用POST请求 

页面跳转和重定向

使用url_for()函数可以构造URL,所以它经常结合redirect()函数来跳转到构造的URL页面

url_for()函数和redirect()函数需要从Flask模块中导入

实例3:模拟登录

登录页面URL为"/login",首页页面URL为"/",代码如下所示

from flask import Flask, url_for, redirect
app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello World!'


@app.route('/login')
def login():
    # 模拟登录流程
    # flag = None
    flag = 'success'
    
    if flag:
        # 如果登录成功,跳转到首页
        return redirect(url_for('index'))
    else:
        # 如果登录失败,重定向到404页面
        re_url = 'https://qzonestyle.gtimg.cn/qzone/hybrid/app/404/'
        return redirect(re_url)
    


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

在浏览器中访问网址http://127.0.0.1:5000/login时,会调用login()方法。如果登录成功,则会使用redirect()函数跳转至index方法,也就是首页

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

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

相关文章

chatGPT AI对话聊天绘画系统开发:打开人工智能AI社交聊天系统开发新时代

人工智能技术的快速发展和普及&#xff0c;催生了众多创新应用&#xff0c;其中&#xff0c;AI社交聊天系统成为当下市场的热门话题&#xff0c;本文将详细介绍开发属于自己的ChatGPT的过程&#xff0c;并探讨当下市场因Chat AI聊天系统所带来的影响性。 AI社交聊天系统的潜力与…

Springboot Mybatis 自定义顺序排序查询,指定某个字段

前言 与本文无关 "我进去了" ....... 正文 今天要讲些什么&#xff1f; 其实很简单&#xff0c;就是查询数据的时候&#xff0c;想根据自己指定的字段的自定义顺序&#xff0c;做排序查询数据。 本篇文章会讲到的几个点 &#xff1a; 1. 单纯sql 怎么实现 排序2. …

miniconda 安装 windows+linux

虽然常用anaconda&#xff0c;但是有时候只需要管理环境的时候&#xff0c;用miniconda更方便 如果想安装anaconda&#xff0c;可以参考这篇&#xff1a;anaconda安装 一、linux下 1.下载 链接&#xff1a;miniconda文档 cd /usr/localwget https://repo.anaconda.com/mini…

分布式处理框架 MapReduce

3.2.1 什么是MapReduce 源于Google的MapReduce论文(2004年12月)Hadoop的MapReduce是Google论文的开源实现MapReduce优点: 海量数据离线处理&易开发MapReduce缺点: 实时流式计算 3.2.2 MapReduce编程模型 MapReduce分而治之的思想 数钱实例&#xff1a;一堆钞票&#xff0…

Inno Setup 安装包制作软件

推荐一个开源的安装包制作软件&#xff1a;Inno Setup   Inno Setup是一个免费的安装制作软件&#xff0c;小巧、简便、精美是其最大特点&#xff0c;支持pascal脚本&#xff0c;能快速制作出标准Windows2000风格的安装界面&#xff0c;足以完成一般安装任务。 下载地址&…

进阶接口自动化测试——认证/代理/超时配置/错误异常(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 认证 1、基本认证…

【Android】Touch 事件分发逻辑梳理和避坑逻辑(上层设置了setOnTouchListener的事件监听但是没有起作用的原因)

背景 在项目中发现我明明在最上层的activity中的一个DrawerLayout对象设置了如下代码: /*** 超级白板的整体点击事件* 保证topBar在合适的时机出现*/binding.layoutMainDrawer.setOnTouchListener { _, event ->if (event.action MotionEvent.ACTION_DOWN) {val isVisib…

【毕业设计】爱琴海——基于HTML5的婚庆用品商城网页设计

一、内容简介 (一)背景与意义 “婚俗”是指结婚的风俗&#xff0c;各国各族人民按照自己的习俗&#xff0c;举行各具特色的婚礼&#xff0c;具有各自浓厚的民族独特风采。婚俗元素在是中国婚俗文化的媒介&#xff0c;承载了中华儿女对幸福和吉祥的追求。在中国婚俗文化的发展过…

【BI数据可视化】Docker部署metabase

开源世界从来不缺分享与馈赠&#xff0c;前一篇已经分享过【BI数据可视化】使用Docker快速部署Superset_wenchun001的博客-CSDN博客&#xff0c;今天我们继续来介绍一款开源的数据可视化系统 Metabase&#xff0c;帮助您解决数据可视化的难题。 Metabase是什么&#xff1f; 在传…

DOTA-cyclo(RGDfK),RGD肽指含有由Arg-Gly-Asp三个氨基酸组成的序列多肽,螯合剂多肽

试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DOTA-cyclo(RGDfK)螯合剂多肽&#xff0c;RGD肽是指含有由Arg-Gly-Asp三个氨基酸组成的序列多肽&#xff0c;有直线肽和环肽之分。它们是许多细胞外基质蛋白&#xff08;如VN、FN…

关于邮件协议的理解、实验以及java mail的实现

1、几种电子邮件系统组成 传统电子邮件系统 一个传统电子邮件系统由以下几个部分组成 UA&#xff08;用户代理&#xff09;邮箱服务器电子邮件协议 邮件发送协议&#xff08;SMTP&#xff09;与邮件接受协议&#xff08;POP3,IMAP&#xff09; 用户代理 UA (User Agent) 定…

mac上mysql启动报错问题Unable to lock ./ibdata1 error: 35

记录一次mac安装mysql启动报错问题Unable to lock ./ibdata1 error: 35。首先&#xff0c;这是第一次在公司新领的mac上面去安装mysql&#xff0c;在去年换新电脑之前&#xff0c;老电脑也安装过&#xff0c;没出现过这种问题。其次&#xff0c;自己的几台windows笔记本也安装过…

VS2019 彻底卸载、安装C\C++\C#

彻底卸载 进入“控制面板 - 程序和功能”&#xff0c;找到并选择VS2019&#xff0c;单击右键选择“卸载”。 在弹出的卸载向导中&#xff0c;我们需要选择要卸载的组件&#xff0c;如果要彻底卸载VS2019&#xff0c;则需要全部选择&#xff0c;并依次执行卸载操作。 在VS2019…

要从HTML中提取img标签的src属性(图片链接),可以使用正则表达式方式。

1. 定义提取src属性的正则表达式: const srcRegex /<img\s(?:[^>]*?\s)?src\s*\s*(["])((?:[^\1"]|\\\1|.)*?)\1/g 这个正则会匹配类似<img src"http://example.com/1.jpg">中的src属性和括号中的连接。2. 调用字符串的matchAll()方法…

系统集成项目管理工程师(项目管理知识[二])

第八章 项目进度管理 1、前导图法4种类型依赖关系&#xff1a; (1)结束-开始的关系&#xff08;F-S型&#xff09; (2)结束-结束的关系&#xff08;F-F型&#xff09; (3)开始-开始的关系&#xff08;S-S型&#xff09; (4)开始-结束的关系&#xff08;S-F型&#xff09; 2、…

Fastjson漏洞

Fastjson 概述 Fastjson是阿里巴巴公司开源的一款json解析器&#xff0c;它可以解析 JSON 格式的字符串&#xff0c;支持将 Java Bean 序列化为 JSON 字符串&#xff0c;也可以从 JSON 字符串反序列化到JavaBean。 漏洞版本 Fastjson <1.2.24 反序列化远程命令执行漏洞 F…

如何关闭带有隐患的端口?一键关闭危险端口?封锁电脑端口工具

你是否担心自己的Windows电脑存在安全隐患&#xff1f;毕竟&#xff0c;黑客攻击时刻都在发生&#xff01;今天&#xff0c;我将为大家分享一些有关Windows危险端口的知识&#xff0c;以及如何一键关闭高危端口&#xff0c;保障你的电脑安全。希望这些能够帮助你更好地保护自己…

Hidl编程实战(一)——定义HAL服务

1. 概述 hidl基本知识可以参考官网 安卓官网-hidl 也讲解了C和Java实现hidl 本文讲解CHal服务的创建 2. 文件的创建 aosp整编过的代码&#xff0c;可以直接choosecombo后使用hidl-gen工具。如果没有整编过&#xff0c;可以单编hidl-gen工具。 hidl-gen工具可以用来协助创建h…

6应用层-6.3【实验】【计算机网络】

6应用层-6.3【实验】【计算机网络】 前言推荐6应用层知识DHCP协议分析DHCP报文格式DHCP抓包分析 6.1 Web服务与FTP服务配置6.2 DNS域名系统配置6.3 DHCP动态协议参数配置实验目的实验内容及实验环境实验原理实验过程1.搭建网络环境2.配置路由器3.配置DSCP服务器4.完成右侧网络主…

20230627通过WPS给PPT幻灯片加入页码

20230627通过WPS给PPT幻灯片加入页码 2023/6/27 23:16 缘起&#xff1a;不想每次都手工给打印的PPT加页码&#xff0c;就通过百度搜索来自动加页码了&#xff01; 真是偷懒让人进步呀&#xff01; 百度搜索&#xff1a;ppt加页码怎么设置 方法步骤.png ?点击「插入」选项卡「幻…