flask库

news2024/12/24 8:20:00

文章目录

  • flask库
      • 1. 基本使用
      • 2. 路由路径和路由参数
      • 3. 请求跳转和请求参数
      • 4. 模板渲染
        • 1. 模板变量
        • 2. 过滤器
        • 3. 测试器
      • 5. 钩子函数与响应对象

flask库

flask是python编写的轻量级框架,提供Werkzeug(WSGI工具集)和jinjia2(渲染模板)两个依赖库。

flask返回的html一定要放在python项目的templates文件夹里。

1. 基本使用

pip install flask

./templates/register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form action="/register" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <input type="submit" value="Submit">
        </div>
    </form>
</body>
</html>

./main.py

from flask import Flask,url_for,request,render_template,make_response,redirect,jsonify,json

app = Flask(__name__)  # 用本脚本名实例化Flask对象

@app.route('/',methods=['GET','POST'])#url配置
def index():#视图函数
    #return 'hello world' 响应给浏览器的内容
    return redirect('/register')#重定向

@app.route('/register',methods=['GET','POST'])
def register():
    if request.method=='POST':
        print(request.form.get('username'),request.form.get('password'))
    return render_template('register.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9901, debug=1)

2. 路由路径和路由参数

from werkzeug.routing import BaseConverter

@app.route('/') #localhost:port/
def index():
    return 'hello world'

@app.route('/index1/') #localhost:port/index1/
def index1():
    return 'index1'

#命名路径也可以声明类型,比如<string:name>
#支持类型 string,int,float,path,uuid,any,default
@app.route('/index2/<name>') #命名路径 #localhost:port/index2/Tom
def index2(name):
    return name #Tom

class RegexConverter(BaseConverter):
    #1. 自定义正则转换器类
    def __init__(self,map,*args): #args=转换器的参数
        self.map=map
        self.regex=args[0]  # BaseConberter中的属性regex

# 2.注册转换器(字典添加键值)
app.url_map.converters['regex']=RegexConverter

@app.route("/index3/<regex('\d{2}'):age>/")
def index3(age):
    return age

@app.route() 用于装饰一个视图函数,函数返回需要在用户浏览器中显示的信息(默认html)。

返回值为字符类型或者是字典

路由参数如下

1. 位置参数
/index 
/index/<name> #动态路由参数,可接受字符串和数字类型
/index/<int:id> #指定变量类型
    
2. methods=['GET','POST']
	#当前视图函数支持的请求方式(默认GET)

3. endpoint=''
	# 路由映射函数,给url起名,依然绑定正下方函数。
	# 不指定默认起名为视图函数名(view_func.__name__)
    # 存储视图函数的view_funcs是以{endpoint:view_func}形式存储,因此视图函数不能同名

3. defaults={key:value}
	#默认参数设置,必须再视图函数中定义一个形参来接收。

4. redirect_to=''
	#永久重定向(301或308)

5. strict_slashes=True/False
	# 设置路由路径匹配是否为严格模式,默认不设置为严格路由匹配模式。
    # 严格模式,路由后面原本没/,加上就会报错

3. 请求跳转和请求参数

./templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form action="{{url_for('index5')}}" method="get">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <input type="submit" value="Submit">
        </div>
    </form>
</body>
</html>

main.py

@app.route('/') #localhost:port/
def index():
    return render_template('index.html')
# 转发模板,渲染模板文件

@app.route('/index4')
def index4():
    url=url_for('index')# '/' 
    #url_for('视图函数名'),返回视图函数对应url
    return redirect(url) #重定向

@app.route('/index5')
def index5():
    u=request.args.get('username')
    p=request.args.get('password')
    # request是全局对象
    # get请求用args.get()
    # post请求用form.get()
    print(u,p)
    return '请求成功'

在这里插入图片描述

4. 模板渲染

​ 模板是一个包含响应文本的文件,其中用占位符(模板变量{{name}})表示动态部分内容,告诉模板引擎具体的值要从具体的数据中获取,用真实值替换变量,再返回最终得到的字符串,这个过程称为‘渲染’。flask使用jinjia2模板引擎渲染模板。

1. 模板变量

在视图(view)中,模板变量向模板中传递数据,动态生成页面内容。

@app.route('/index6')
def index6():
    return render_template('test.html',a=123,b=[4,5,6])

./templates/test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <p>{{a}}</p>
    <p>{{b}}</p>
    {{ config.__class__.__init__.__globals__['os'].listdir('.') }}
</body>
</html>
2. 过滤器
{{ name|upper }}
{{ name|lower }}
{{ name|length }}
{{ name|trim }}
{{ name|default('name不存在') }}
{{ name|default('name为None,0,false,""',true) }}
3. 测试器

if…elif…else…endif

for…endfor

{% if m is defined %}
	{{m}}
{% else %}
    999
{% endif %}

{% for i in range(10) %}
	{{i}}
{% endfor %}

5. 钩子函数与响应对象

Flask装饰器注册钩子函数说明
@app.before_request在每一次请求前调用,先绑定先执行,先flask app后blueprint
@app.before_first_request只在第一次请求之前调用(似乎没有这个)
@app.after_request每一次请求之后都会调用,接收response对象,执行完后记得归还,先绑定的后执行
@app.teardown_request每次请求之后都会调用,先绑定的后执行

在这里插入图片描述

@app.before_request
def first():
    print("Nice to meet you!")

@app.route('/') #localhost:port/
def index():
    data = {
        'name': '张三'
    }
    # json.dumps 将一个python数据结构转化为json
    # json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
    # 生成一个response响应对象,而不是直接return来返回响应对象,便于执行更多的后续操作
    response = make_response(json.dumps(data, ensure_ascii=False))
    # 修改响应数据的MIME标准类型为json(在发送数据前会先发送该类型)
    response.mimetype = 'application/json'
    response.status = '200'  # 状态码
    response.headers['name'] = 'success!'
    return response

@app.errorhandler(404)
def page_not_found(e):
    return '页面没找到'

if __name__ == '__main__':
    print(app.url_map)# 查看所有的路由信息
    app.run(host='0.0.0.0', port=9901, debug=1)

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

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

相关文章

SpringBoot+Vue.js协同过滤算法美食推荐小程序

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的&#xff0c;所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套协同过滤算法美食推荐小程序&#xff0c;帮助…

【SQL Server】实验四 数据更新

1 实验目的 掌握SQL数据更新语句的基本使用方法&#xff0c;如UPDATE、DELETE、INSERT。掌握更新语句条件中的嵌套查询使用方法。 2 实验内容 2.1 掌握SQL更新语句的基本使用方法 INSERT基本语句。UPDATE基本语句。DELETE基本语句。 2.2 掌握SQL更新语句的高级使用方法 …

SimpleDateFormat类 --java学习笔记

SimpleDateFormat 代表简单日期格式化&#xff0c;可以用来把日期对象、时间毫秒值格式化成我们想要的形式 常见构造器和方法&#xff1a; pattern 代表需要应用的时间格式—— 时间格式的常见符号&#xff1a; 时间格式的应用举例&#xff1a; import java.text.SimpleDate…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列&#xff09;简称MQ&#xff0c;是一种应用程序对应用程序的消息通信机制。在MQ中&#xff0c;消息以队列形式存储&#xff0c;以便于异步传输&#xff0c;在MQ中&#xff0c;发布者&#xff08;生产者&#xff09;将消息放入队列&#xff…

基于信号分解的几种一维时间序列降噪方法(MATLAB R2021B)

自适应信号分解算法是一种适合对非平稳信号分析的方法&#xff0c;它将一个信号分解为多个模态叠加的形式&#xff0c;进而可以准确反应信号中所包含的频率分量以及瞬时频率随时间变化的规律。自适应信号分解算法与众多“刚性”方法(如傅里叶变换&#xff0c;小波变换)不同&…

最后十几天!未备案小程序将会被清退

微信官方通知 2023年8月9日&#xff0c;微信公众平台发布了“关于开展微信小程序备案的通知”&#xff1a; 去年就已经在逐步推进备案了&#xff0c;新注册小程序必须备案才可以上架。若微信小程序已上架&#xff0c;须于2024年3月31日前完成备案&#xff0c;逾期未完成备案&a…

苹果大模型MM1强势来袭!300亿参数所向披靡

功能展示 左图问&#xff1a;图片中有多少个苹果&#xff1f; 苹果大模型答&#xff1a;7个 左图问&#xff1a;这些州中哪一个是最北的&#xff1f; 回答&#xff1a;Delaware 追问&#xff1a;其他的州是什么&#xff1f; 回答&#xff1a;Arizona, Oklahoma, North Caro…

Ant Design Pro complete版本的下载及运行

前言 complete 版本提供了很多基础、美观的页面和组件&#xff0c;对于前端不太熟练的小白十分友好&#xff0c;可以直接套用或者修改提供的代码完成自己的页面开发&#xff0c;简直不要太爽。故记录一些下载的步骤。 环境 E:\code>npm -v 9.8.1E:\code>node -v v18.1…

[HTML]Web前端开发技术24(HTML5、CSS3、JavaScript )JavaScript基础JavaScript,Netscape,事件处理代码,外部JS——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Java学习笔记(12)

包 导包 Final 不能被改变的&#xff0c;修饰方法 类 变量 方法不能被重写 类不能被继承 变量&#xff0c;赋值一次&#xff0c;变成常量&#xff0c;不能再被赋值 final修饰引用数据类型&#xff0c;地址值不能变&#xff0c;里面的内容可以变 字符串是不可变的 源码中使…

ubuntu(20.04)-安装JAVA环境-IDEA

1.下载IDEA 2.解压文件 sudo tar -zxvf idealC-2022.2.3.tar.gz -C /opt 3.添加环境变量&#xff1a; .vim ~/.bashrc export IDEA_HOME/opt/ideaIC-2022.2.3/ export PATH${IDEA_HOME}/bin:$PATH source ~/.bashrc 4.启动&#xff1a; cd /opt/ideaIC-2…

安装jupyter报错:404 GET /static/notebook/4131.bundle.js

1、报错安装过程 我直接是pip install jupyter 进行的安装&#xff0c;如下&#xff0c;安装的版本是7.1.2 2、报错结果 运行jupyternotebook后报错&#xff1a;404 GET /static/notebook/4131.bundle.js (3bea7012d1534d70a935c3c193d9308d127.0.0.1) 5.70ms refererht…

cf(163)

D. Tandem Repeats? 找最长串联字串的长度 #include<iostream> #include<algorithm> #include<cstring> #include<queue> #include<vector> #include<map> using namespace std; typedef pair<int,int>PII; typedef long long ll…

ThingsBoard Edge 安装部署

文章目录 一、概述1.官方文档2.部署说明3.安装准备3.1. 克隆服务器3.2.安装 Docker3.3.安装 Java 113.4.安装 PostgreSQL3.5.下载安装包 二、安装部署1.创建 Edge 实例2.创建数据库3.Edge 服务安装3.1.安装服务3.2.配置 Edge3.3.运行安装脚本3.4.重新启动服务 4.访问 Edge5.故障…

基于ssm+layui的图书管理系统

基于ssmlayui的图书管理系统 账户类型分为&#xff1a;管理员&#xff0c;用户管理员私有功能用户私有功能公共功能技术栈功能实现图 视频演示 账户类型分为&#xff1a;管理员&#xff0c;用户 图书管理系统主要登录账户类型为管理员账户与用户账户 管理员私有功能 账户管理…

算法的渐进时间复杂度

T(n) = O(F(n)) T(n):Time 渐进时间复杂度 O:正比例关系 F(n):代码执行次数 只要代码执行的次数越来越多 所耗费的时间也就越来越高 常见的5种: O(n^2) O(n logn) O(n) O(logn) O(1):不管重复多少次1次也是这个时间,10次也是这个时间。 时间复杂度排序:由小到…

关于如何在BIOS中设置引导顺序,看这篇文章就差不多了

前言 更改计算机上“可引导”设备(如USB端口、软盘驱动器或光盘驱动器中的硬盘驱动器或可引导介质)的引导顺序非常容易。 为什么要更改引导顺序 有几个场景需要更改引导顺序,例如启动一些数据销毁工具和可引导防病毒程序,以及安装操作系统。 BIOS设置实用程序用于更改引…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ScrollBar)

滚动条组件ScrollBar&#xff0c;用于配合可滚动组件使用&#xff0c;如List、Grid、Scroll。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 接口 ScrollBar(val…

C++ 入门篇

目录 1、了解C 2、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入与输出 4.缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 5. 函数重载 5.1 函数重载的概念 5.2 C中支持函数重载的原理--名字修饰 6. 引用 6.1 引用概念 6.2 引用…

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…