【Flask】Python基于Flask应用

news2024/11/15 15:55:17

Flask介绍

Flask 是一款发布于2010年非常流行的 Python Web 框架。

特点

  1. 微框架、简洁,给开发者提供了很大的扩展性。
  2. Flask和相应的插件写得很好,用起来很爽。
    开发效率非常高,比如使用 SQLAlchemy 的 ORM 操作数据库可以节省开发者大量书写 sql 的时间。
  3. Flask 的灵活度非常之高,他不会帮你做太多的决策,很多都可以按
    照自己的意愿进行更改。

比如:
使用 Flask 开发数据库的时候,具体是使用 SQLAlchemy 还是MongoEngine,选择权完全掌握在你自己的手中。

Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮
件扩展 Flask-Mail ,用户认证 Flask-Login ,数据库 Flask-SQLAlchemy ),都需要用第三方的扩展来实现。

Flask 没有默认使用的数据库,可以选择 MySQL ,也可以用NoSQL

其 WSGI 工具箱采用 Werkzeug (路由模块),模板引擎则使用Jinja2 。这两个也是 Flask 框架的核心

扩展

  • Flask-SQLalchemy:操作数据库;
  • Flask-script:插入脚本;
  • Flask-migrate:管理迁移数据库;
  • Flask-Session:Session存储方式指定;
  • Flask-WTF:表单;
  • Flask-Mail:邮件;
  • Flask-Bable:提供国际化和本地化支持,翻译;
  • Flask-Login:认证用户状态;
  • Flask-OpenID:认证;
  • Flask-RESTful:开发REST API的工具;
  • Flask-Bootstrap:集成前端Twitter Bootstrap框架;
  • Flask-Moment:本地化日期和时间;
  • Flask-Admin:简单而可扩展的管理接口的框架

文档地址
中文文档
英文文档

Flask的安装

pip install flask

第一个Flask程序

#从flask包中导入Flask类
from flask import Flask
#创建一个Flask对象
app = Flask(__name__)
#@app.route:是一个装饰器
#@app.route('/')就是将url中 / 映射到hello_world
设个视图函数上面
#以后你访问我这个网站的 / 目录的时候 会执行hello_world这个函数,然后将这个函数的返回值返回给浏览器
@app.route('/')
def hello_world():
   return '尚学堂' #启动这个WEB服务
if __name__ == '__main__': 
 #默认为5000端口
    app.run()  #app.run(port=8000)

启动运行

python helloworld.py

在这里插入图片描述

运行方式

通过对象运行
运行程序时,可以指定运行的主机IP地址,端口

app.run(host="0.0.0.0", port=5000) #
127.0.0.1

参数解释

  • host
    主机IP地址,可以不传
    默认localhost

  • port
    端口号,可以不传
    默认5000

通过Python运行方式运行

app = Flask(__name__)
@app.route("/")
def index():
    return "hello world"
if __name__ == '__main__':
    app.run()

如果想在同一个局域网下的其他电脑访问自己电脑上的Flask网 站,需要设置 host=‘0.0.0.0’ 才能访问得到

通过Flask自带命令运行

app = Flask(__name__)
@app.route("/")
def index():
    return "hello world"
# 程序中不用再写app.run()
$ export FLASK_APP=helloworld
$ flask run
 * Running on http://127.0.0.1:5000/

比如

flask run -h 0.0.0.0 -p 8000

命令行下,可以使用使用简写 可以通过 flask run --help 获取帮助

 -h, --host TEXT                 The interfaceto bind to.
 -p, --port INTEGER             The port tobind to.
 --reload / --no-reload         Enable ordisable the reloader. By default
                               the reloaderis active if debug is enabled.
 --debugger / --no-debugger     Enable ordisable the debugger. By default
 --help                         Show thismessage and exit.

Debug模式与配置参数加载

在代码中制作一个错误

@app.route('/')
def hello_world():
  a = 1
  b = 0
  c = a/b
  return 'Hello World!'
if __name__ == '__main__':
  app.run()

启动并访问
在这里插入图片描述

控制台倒是给出了错误提示信息,但是我们希望在浏览器也能有相应的提示信息

开启Debug模式
运行时传递参数

app.run(debug = True)

通过 app.deubg 参数设置

app.debug = True
app.run()

通过修改配置参数 config

app.config.update(DEBUG=True)
# app.config['DEBUG'] = True
app.run()

通过mapping加载

app.config.from_mapping({'DEBUG':True})
app.run()

通过配置对象设置 config

class Config:
    DEBUG = True
app.config.from_object(config)
app.run()

通过配置文件设置 config
config.py

DEBUG = True

config.json

{"DEBUG":"True"}

app.py

app.config.from_pyfile('config.py')
app.config.from_json('config.json')

通过环境变量

DEBUG = True
app.config.from_envvar('DEBUG')

URL与函数的映射(动态路由)

URL路径参数
比如,有一个请求访问的接口地址为 /users/11001 ,其中 11001 实际上为
具体的请求参数,表明请求 11001 号用户的信息。

此时如何从url中提取出 11001 的数据?

@app.route('/users/<user_id>')
def user_info(user_id):
    print(type(user_id))
    return 'hello user{}'.format(user_id)

其中 <user_id> ,尖括号是固定写法,语法为 , variable 默认的
数据类型是字符串。
如果需要指定类型,则要写成 converter:variable ,其中
converter 就是类型名称,可以有以下几种:

  1. string:如果没有指定具体的数据类型,那么默认就是使用 string 数据类型。
  2. int:数据类型只能传递 int 类型。
  3. float:数据类型只能传递 float 类型。
  4. path:数据类型和 string 有点类似,都是可以接收任意的字符串,但是 path 可以接收路径,也就
    是说可以包含斜杠。
  5. uuid:数据类型只能接收符合 uuid 的字符串。 uuid 是一个全宇宙都唯一的字符串,一般可以用来作为表的主键。
  6. any:数据类型可以在一个 url 中指定多个路径。例如:将上面的例子以整型匹配数据,可以如下使用:
@app.route('/users/<int:user_id>') 2 def user_info(user_id):
    print(type(user_id))
    return f'正在获取 ID {user_id} 的用户信息' 567 @app.route('/users/<int(min=1):user_id>') 8 def user_info(user_id):
    print(type(user_id))
   return f'hello user {user_id}'

若是数据与设置的类型不能匹配,则会返回 Not Found

自定义转换器

为什么路径参数可以直接识别数据类型?

提示 从 werkzeug.routing 导入 BaseConverter 类 了解底层 int 路径参数底层调用
IntegerConverter 类来作格式判断 float 路径参数底层调用 FloatConverter 类来作格式判断 string
路径参数底层调用 StringConverter 类来作格式判断

如果遇到需要匹配提取 /sms_codes/1688888888 中的手机号数据,Flask内
置的转换器就无法满足需求,此时需要自定义转换器。
定义方法
自定义转换器主要做3步

  1. 创建转换器类,保存匹配时的正则表达式
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
    """
   手机号格式
   """
    regex = r'1[3-9]\d{9}'

regex 名字是固定的

  1. 将自定义的转换器告知Flask应用
app = Flask(__name__)
# 将自定义转换器添加到转换器字典中,并指定转换器使
用时名字为: mobile
app.url_map.converters['mobile'] =
MobileConverter
  1. 在使用转换器的地方定义使用
@app.route('/sms_codes/<mobile:mob_num>')
def send_sms_code(mob_num):
    return 'send sms code to
{}'.format(mob_num)

to_python
在转换器类中,实现 to_python(self,value) 方法,这个方法的返回值,将会
传递到 view函数中作为参数

to_url
在转换器类中,实现 to_url(self,values) 方法,这个方法的返回值,将会在
调用url_for函数的时候生成符合要求的URL形式。

#需求2:查询多个模块的数据
#传统的思路实现
@app.route('/news_list/<modules>/')
def news_list(modules):
    #modules是路径参数
    print(modules)
  
#http://127.0.0.1:5000/news_list/hots+enter/
    #需要对modules进行拆分
    lm = modules.split('+')
    print(lm)
    print(lm[0])
    print(lm[1])
    #拆分后需要去数据库 select * from news 
where nmodule= 'hots'   ornmoudle= 'enter'
 return   f'你要查询的模块是:{lm}'
 class LiConverter(BaseConverter):
    # 1.在转换器类中,实现to_python(self,value)方法,这个方法的返回值,将会传递到 view函数中作为参数。
    def to_python(self, value):
        return  value.split('+')   #可以对value进行加工后再返回
    # 2.在转换器类中,实现to_url(self,values)方法,这个方法的返回值,将会在调用url_for函数的时候生成符合要求的URL形式。
    def to_url(self, value):
        # return "hello"
        #['hots','enter']---->hots+enter
       return "+".join(value)
 app.url_map.converters['li']=LiConverter

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

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

相关文章

【LeetCode】数据结构题解(5)[分割链表]

分割链表 1.题目来源2.题目描述3.解题思路4.代码展示 所属专栏&#xff1a;玩转数据结构题型 博主首页&#xff1a;初阳785 代码托管&#xff1a;chuyang785 感谢大家的支持&#xff0c;您的点赞和关注是对我最大的支持&#xff01;&#xff01;&#xff01; 博主也会更加的努力…

聊一聊 GDB 调试程序时的几个实用命令

一&#xff1a;背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯&#xff0c;不习惯在于想用的命令或者面板找不到&#xff0c;总的来说还是各有千秋吧&#xff0c;今天我们来聊一下几个在调试中比较实用的命令&#xff1a; 查看内存硬件…

B站java、计算机学习整理(菜鸟版本)

B站java、计算机学习整理&#xff08;菜鸟版本&#xff09; 简介1、入门篇2、工具篇3、数据库篇4、框架篇5、JVM 篇6、源码篇7、算法与数据结构8、操作系统9、计算机组成原理10、计算机网络11、 设计模式 简介 处在互联网时代&#xff0c;是一种幸福&#xff0c;因为各式各样的…

Win10系统开机自动蓝屏无法使用怎么U盘重装系统?

Win10系统开机自动蓝屏无法使用怎么U盘重装系统&#xff1f;今天和大家一起来分享Win10系统蓝屏之后怎么去进行修复的方法。很多用户都有遇到电脑蓝屏无法启动的问题&#xff0c;那么遇到这个问题之后怎么去重装系统呢&#xff1f;接下来我们来看看以下的解决方法分享吧。 准备…

Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录 主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw 接口&#xff1a;aHR…

牛客_华为_ HJ63 DNA序列

HJ63 DNA序列 st input() n int(input())max_ratio 0 ratio 0 res for i in range(0,len(st)-n1):s st[i:in]ratio s.count(C)s.count(G)if ratio > max_ratio:max_ratio ratiores s print(res)

cPanel XSS漏洞分析研究(CVE-2023-29489)

一、漏洞原理 漏洞简述 cPanel 是一套在网页寄存业中最享负盛名的商业软件&#xff0c;是基于于 Linux 和 BSD 系统及以 PHP 开发且性质为闭源软件&#xff1b;提供了足够强大和相当完整的主机管理功能&#xff0c;诸如&#xff1a;Webmail 及多种电邮协议、网页化 FTP 管理、…

【考前看几题】系统集成项目管理师-2022年上半年-上午真题(广东卷)

前言 汇总知识点、重点问题、难点 由问题引出知识点 软件技术、其他技术、管理基础、整体管理、范围管理、成本管理、人力资源管理 干系人管理、合同管理、采购管理、配置管理、质量管理、风险管理、安全管理 文章目录 前言软件技术、其他技术管理基础整体管理范围管理成本管理…

第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第128讲。 第12届蓝桥杯Scratch国赛真题&#xff0c;这是2021年5月29日举办的全国总决赛&#xff0c;比赛仍然采取线上…

【java】Java 异常处理的十个建议

文章目录 前言一、尽量不要使用e.printStackTrace(),而是使用log打印。二、catch了异常&#xff0c;但是没有打印出具体的exception&#xff0c;无法更好定位问题三、不要用一个Exception捕捉所有可能的异常四、记得使用finally关闭流资源或者直接使用try-with-resource五、捕获…

TCP协议特性讲解

文章目录 TCP报文结构确认应答超时重传三次握手与四次挥手滑动窗口流量控制拥塞控制延时应答捎带应答面向字节流 - 粘包问题异常处理 - 心跳包 TCP报文结构 16位源端口号&#xff1a;表示数据从哪来的。 16位目的端口号&#xff1a;表示数据要到哪里去。 32位序号&#xff1a;由…

Centos7 安装 MySql8

1、查看是否安装 mariadb rpm -qa | grep mariadb 显示&#xff1a;mariadb-libs-5.5.56-2.el7.x86_64 2、卸载 mariadb rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 3、安装 mysql 依赖包 yum install libaio 4、创建 mysql 安装目录 mkdir /usr/local/mysql 创…

【完整攻略】OPPO手机无密码解锁方法

全世界有数百万人拥有 OPPO 手机。它以其经济实惠但功能强大的智能手机而闻名。但是&#xff0c;与许多其他人一样&#xff0c;您可能会在某些日子后忘记密码。那么&#xff0c;如果您忘记了 OPPO 手机的密码或图案怎么办&#xff1f;你将如何解锁它&#xff1f;这是一个大问题…

Java+大数据学习笔记分享!

今天给大家分享一个笔记网站&#xff01; 我在码云中整理超全面学习笔记内容&#xff01; Gitee地址&#xff1a;https://gitee.com/fanggaolei/learning-notes-warehouse 项目中目前包含了大数据和Java后端方向的全部学习笔记&#xff0c;同样也是一个学习路线&#xff0c;笔记…

1-photoshop--修改图片内容--填充的使用

一、photoshop--修改图片内容--填充的使用&#xff1a; 在photohsop中没有发现图形填充功能&#xff0c;如何实现功能&#xff1f; 需要把这个图片中的原有文字覆盖 &#xff0c;1.使用吸管工具 &#xff0c;获取图片背景颜色&#xff0c;前景色为需要的颜色 2.在需要的选择进…

采购管理怎么做(详解采购工作流程)

阅读本文您将了解&#xff1a;1.采购管理的意义&#xff1b;2.采购工作流程&#xff08;中小企业&#xff09;&#xff1b;3.采购管理未来发展趋势。 一、采购管理的意义 采购管理是指企业为满足生产经营需要&#xff0c;对外部供应商进行的采购活动的规划、组织、实施和控制…

RocketMQ-ONS 内存占用过大问题处理

RocketMQ-ONS 内存占用过大问题处理 1、问题环境描述2、问题现像描述3、问题分析3.1、问题定位阶段1&#xff08;确认内存占用原因&#xff09;3.2、问题定位阶段2&#xff08;缓存参数配置无效问题&#xff09;3.3、问题定位阶段2&#xff08;分析占用原因&#xff09; 4、解决…

详解文件操作和 IO

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;javaEE初阶 &#x1f397;️ 如何优雅的活着&#xff0c;是我找寻的方向 目录 一、认识文件二、文件路径三、文件系统操作四、文件内容的操作读写 - 数据流4.1 InputStream 概述4.2 OutputStream 概…

快讯 | ALVA Systems 参加 Open Bosch 首届 Demo Day 活动

4 月 27 日&#xff0c;博世&#xff08;中国&#xff09;投资有限公司&#xff08;下以“博世”简称&#xff09;在上海总部举办 Open Bosch 第一届 Demo Day 活动&#xff0c;展示与初创伙伴的合作项目成果&#xff0c;宣传合作理念&#xff0c;为初创伙伴搭建参观交流的开放…

【Matter】esp-matter开发环境搭建

文章目录 esp-matter开发环境搭建前提准备1.Ubuntu22.04&#xff08;内存不小于80G&#xff09;2.网络环境 esp-idf 开发环境搭建1.Problem1 solution2.Problem2 solution esp-matter开发环境搭建 esp-matter开发环境搭建 前提准备 1.Ubuntu22.04&#xff08;内存不小于80G&am…