当前位置: 首页 > news >正文

Flask入门:从零搭建Web服务器

day01_flask入门

一、创建项目

  1. 创建一个虚拟环境

  2. 安装Flask框架,点击底部Python Packages选项,搜索Flask软件包

  3. 看到已安装的软件中存在flask和jinja2即可

  1. 如果上述方式无法打开则使用命令行终端执行下载命令 ○ 建议修改终端配置,修改为cmd模式

    pip install flask


2 启动web服务器

  1. 创建一个demo.py文件,导入对应的Flask依赖包,并启动服务器

# 导入Flask类
from flask import Flask
​
# Flash 接收一个参数__name__,当前模块的文件名
# Flash 在查找静态文件或模板时会默认以文件所在目录去查找
app = Flask(__name__)
​
# 装饰器将路由映射到视图index方法
@app.route('/')
def index():return "hello ~"
​
if __name__ == '__main__':# Flash 应用程序实例的方法run启动web服务器app.run()

3 初始化参数

import_name: 导包的目录 static_path: 访问静态资源的路径 static_url_path: 访问静态文件的url前缀 static_folder: 默认'static' template_folder: 默认'templates'

实例化Flask对象后,静态文件默认在模块所在目录下的static目录,模板使用templates目录(需手动创建)。 示例:在static目录放图片01.jpeg,访问路径:http://127.0.0.1:5000/static/01.jpeg

自定义配置示例:

app = Flask(__name__,static_folder='static',   # 静态文件目录名template_folder='templates'  # 模板文件目录名
)

4 配置

Flask无默认配置文件,需自定义两种方式:

  1. 从配置文件读取app.config.from_pyfile('文件名')

    • 创建config.cfg(变量名全大写):

      DEBUG = True
    • 在代码中加载:app.config.from_pyfile('config.cfg')

  2. 从类读取app.config.from_object(类名)

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

注意

  • 配置变量名需大写

  • 多个配置同名时后加载的覆盖前面的


5 app.run参数

  • host: 服务器主机地址(默认'127.0.0.1')

  • port: 端口号(默认5000)

  • debug: 是否开启调试(默认False)

示例:

app.run(host='0.0.0.0', port=8088, debug=True)  # 监听所有IP

输出示例:

* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8088
* Running on http://192.168.31.149:8088

6. 读取templates中的模板文件

from flask import Flask, render_template
​
@app.route('/home')
def index():return render_template('home.html')  # 需在templates目录创建home.html

二、路由配置

1. 认识路由

路由是根据URL找到对应视图函数的过程。两种构建方式:

  1. 装饰器@app.route(url规则)

  2. 方法add_url_rule(rule, endpoint=None, view_func=None, **options)

    • rule: URL规则字符串

    • endpoint: 注册规则的端点(默认视图函数名)

    • view_func: 视图函数

# 装饰器方式
@app.route('/')
def index():return 'ok'
​
# 等效方法
app.add_url_rule('/', 'index', index)

2. 查看路由信息

通过app.url_map查看所有路由:

@app.route('/')
def index():print(app.url_map)  # 输出路由信息return "我是初始页"
​
@app.route('/home')
def home():return "我是首页"

输出示例:

Map([<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>,<Rule '/' (HEAD, GET, OPTIONS) -> index>,<Rule '/home' (HEAD, GET, OPTIONS) -> home>
])

3. 同一路由装饰不同视图

只有第一个视图生效: 同一个路由规则装饰不同函数,只有第一个视图函数会匹配到。虽然都生成了路由表,但是url匹配中第一个规则之后就会调用视图,不再继续往下匹配。

@app.route('/index')
def index1():  # 此函数生效return '我是第一个'
​
@app.route('/index')
def index2():  # 不会执行return '我是第二个'

路由表里面存在,但是不会被读取。所以尽量不要重名

4. 一个视图函数多个路由装饰器

同一视图可绑定多个路由:

@app.route('/details1')
@app.route('/details2')
def index1():return '我是详情页'  # 两个URL均可访问

5. methods 参数

HTTP (与 Web 应用会话的协议)有许多不同的访问 URL 方法。默认情况下,路由只回应 GET 请求,但是通过 route() 装饰器传递 methods 参数可以改变这个行为

methods 参数接收一个字典,元素为字符串形式的请求方式名称。 如果不传methods参数,默认支持GET, HEAD, OPTIONS

OPTIONS 给客户端提供一个敏捷的途径来弄清这个 URL 支持哪些 HTTP 方法。 从 Flask 0.6 开始,实现了自动处理。

HEAD 浏览器告诉服务器:欲获取信息,但是只关心 消息头 。应用应像处理 GET 请求一样来处理它,但是不分发实际内容。在 Flask 中你完全无需 人工 干预,底层的 Werkzeug 库已经替你打点好了。

指定路由支持的HTTP方法(默认GET):

# 注意:需要导入requests库
from flask import request
​
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return '你用post请求了我'else:return '这里是get请求'

6. 反向解析

url_for 通过视图函数名解析URL:

@app.route("/python")
def req_python():return 'python'
​
@app.route("/url_for")
def req_url():return f'<a href="{url_for("req_python")}">链接</a>'

7. 动态路由

URL变量放在< >中,支持类型转换器:

  • int: 整数

  • float: 浮点数

  • path: 结尾含斜线的字符串

@app.route('/param/<name>')
def get_url_param(name):return f'参数:{name}'
​
@app.route('/param_int/<int:id>')
def get_url_param_int(id):return f'参数:{id}'

8. 自定义正则转换器

Flask路由转换器,没有提供基于正则的,但是我们可以自定义基于正则的路由转换器

步骤:

  1. 自定义转换器必须继承BaseConverter类,自定义转换器需要重写父类的init方法

  2. 注册转换器,url_map中保存了所有的路由转换器,是字典类型

from werkzeug.routing import BaseConverter
​
class RegexListConverter(BaseConverter):def __init__(self, url_map, *items):super().__init__(url_map)self.regex = r'\d+(,\d+)*'  # 匹配"1,2,3"
​def to_python(self, value):return value.split(',') if value else []
​
# 注册转换器
app.url_map.converters['re'] = RegexListConverter
​
# 使用
@app.route('/param_re/<re(r"\d"):num>/<re(r"\d+"):num2>')
def get_param_re(num, num2):return f'参数1:{num}, 参数2:{num2}'

http://www.dtcms.com/a/329749.html

相关文章:

  • 雅思大作文笔记
  • iOS 签名证书在版本迭代和iOS上架中的全流程应用
  • Docker 在 Linux 中的额外资源占用分析
  • 智汇河套,量子“风暴”:量子科技未来产业发展论坛深度研讨加速产业成果转化
  • 信息学奥林匹克竞赛(NOI/NOIP/CSP) 学习进度自查表
  • 使用 Python Selenium 和 Requests 实现歌曲网站批量下载实战
  • 嵌入式学习 day50 IMX6ULL裸机开发 - 时钟
  • Linux 5.15.189-rt87 实时内核安装 NVIDIA 显卡驱动
  • 手机充电线贴标机如何使用
  • 内存可见性和伪共享问题
  • php7 太空船运算符
  • 在实验室连接地下车库工控机及其数据采集设备
  • 《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)学习)》
  • Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)
  • SpringMVC 6+源码分析(六)参数处理
  • 18. parseInt 的参数有几个
  • C语言——深入理解指针(三)
  • 【LeetCode】6. Z 字形变换
  • 美团搜索推荐统一Agent之性能优化与系统集成
  • Linux小白加油站,第二周
  • 云手机未来的发展趋势如何?
  • docker load镜像后 名字和标签异常解决
  • Centos 用户管理
  • [Oracle数据库] Oracle的表维护
  • 使用dify搭建hr简历助手-上传简历-对接飞书ai表格
  • .NET 应用程序 Linux下守护进程脚本编写
  • 集成电路学习:什么是Image Processing图像处理
  • GIS 常用的矢量与栅格分析工具
  • 机器学习——svm支持向量机
  • 向量相似度计算与Softmax概率分布对比