Python Flask 学习笔记 —— 二(路由,视图函数,jinjia2语法)
Python Flask —— 二(路由、jinji2语法)
- 一、使用路由和视图函数
- 1.1 路由的概念
- 1.2 定义一个路由
- 1.3 使用 动态路由
- 1.4 视图函数的响应
- 1.4.1 生成重定向的响应
- 1.4.2 返回 JSON 数据
- 1.5 自定义错误页面
- 1.6 路由请求方法监听(补充更新)
- 二、模板语法
- 2.1 Jinjia2 模板初体验
- 2.2 变量
- 2.3 使用过滤器
- 2.3.1 常见过滤器
- 2.3.2 使用过滤器
- 2.4 控制结构
- 2.5 循环语法
- 2.6 访问静态文件
- 2.7 前端页面外联跳转
一、使用路由和视图函数
1.1 路由的概念
客户端(Web 游览器)发送网络请求到 Web 服务器,Web 服务器再把请求转发给 Flask 程序实例。程序实例需要知道每个 URL 请求运行哪些代码。所以保存了一个 URL 到 Python 函数的映射关系。处理 URL 和函数之间的关系的程序叫做 路由
1.2 定义一个路由
定义一个路由需要使用 app.route 修饰器,把修饰的函数注册为路由。与之配套的是 视图函数,Flask 通过这个视图函数,来处理客户端的请求并返回数据
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello World"if __name__ == '__main__':app.run()
这里解释一下上述代码。我们使用 hello() 函数注册为根地址的处理程序,当服务器接收到来自 http://localhost:5000 的网络请求,flask 示例就会查找根目录下的 视图函数 (hello 函数),找到后把返回值给客户端。
1.3 使用 动态路由
我们可以在传递的 url 中指定参数,然后我们在地址栏输入的参数就可以显示到网页当中,只需使用特定的语法就可以实现
- 传入动态参数
- 传入默认参数
这里补充一点点内容,一个 视图函数可以绑定多个 URL
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello World"# 在这里我们可以在地址栏中 传入 name 参数,然后在 视图函数中可以接收到这个参数,并把数据显示出来
@app.route("/user", defaults={'name':'Programmer'})
@app.route("/user/<name>")
def user(name):return f"<h1>Hello {name} </h1>"# 指定用户传入的参数类型,这个可以是 int,float,等等其他类型数据
@app.route('/user/<int:num>')
def user1(num):return f"<h2>传进来的参数是 {num} </h2>"if __name__ == '__main__':app.run()
常见的 URL 处理中的变量转换器
1.4 视图函数的响应
参数一:响应内容
Flask’ 实例调用了 视图函数之后,会将其返回值作为响应内容。响应的内容包含简单的字符串,json 数据,xml 数据,html 页面给客户端
参数二:http 状态码
但是 http 协议中一个重要的部分就是 响应状态码。FLask 中默认的状态码都是 200,其实这个我们是可以手动改变的,比如手动改变 404 使访问失效
参数三:header 对象
这里一般不需要设置,但是如果我们想要返回指定格式的数据,比如 html,我们需要在 header 中加上 Content-Type: text/html ,json数据就是 json 还有很多等等
1.4.1 生成重定向的响应
访问该路由时,会跳转到 百度的主页
from flask import Flask,redirectapp = Flask(__name__)@app.route("/hello")
def hello():return redirect('http://www.baidu.com')@app.route('/hi')
def hi():return redirect(url_for('hello')) # 重定向到 /helloapp.run()
1.4.2 返回 JSON 数据
from flask import Flask, make_response
import jsonapp = Flask(__name__)# 这种方法不常用
@app.route("/api/json1")
def json1():data = {"name":"Gelly","age":18}# 生成指定的响应response = make_response(json.dumps(data))# 指定返回的数据为 jsonresponse.mimetype = 'application/json'return response# 使用 flask 提供的 jsonfiy 函数实现 json序列化
@app.route("/api/json2")
def json2():data = {"name":"Gelly","age":18}return jsonify(data)if __name__ == '__main__':app.run(host="127.0.0.1",debug=True,port=5000)
返回结果
1.5 自定义错误页面
像常规路由一样,flask 允许程序基于模板自定义错误页面,最常用的状态码有另个 404,500,下面是使用示例
@app.errorhandler(404)
def page_not_found(e):return render_template('404.html'),404@app.errorhandler(500)
def internal_server_error(e):return render_template('500.html'),500
当我们访问一个不存在的页面时,就会提示我们页面不存在了
1.6 路由请求方法监听(补充更新)
路由默认只监听 GET 方法,如果需要监听其他的请求方法,我们需要在 属性 methods 中指定
我们只需要在装饰器中增加一个 methods 参数,就可以实现其它的请求
如果我们需要根据不同的请求方式来返回不同的数据,就可以使用 request.method 方法来实现
from flask import Flask,requestapp = Flask(__name__)@app.route("/", methods=['POST','GET'])
def hello():# 如果是 post 请求就做如下参数# 指定请求,返回不同的数据if request.method == 'POST':return "Hello"else:return 'Hello World'app.run()
二、模板语法
2.1 Jinjia2 模板初体验
首先在 flask 项目的根目录创建一个 templates 的目录,然后写两个简单的 html 文件,分别是 index.html 和 user.html
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我是第一个页面</title>
</head>
<body><h1>Hello World</h1>
</body>
</html>
user.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>欢迎你 {{name}}</title>
</head>
<body><!-- 这里我就是用了 Jinjia 2 的模板语法 --><h1>欢迎你,{{name}}</h1>
</body>
</html>
然后修改视图函数,使用 render_template 会使 flask 程序目录中的 templates 子文件中搜寻对应的文件。
render_template 第一个参数对应的是模板文件名,随后的参数都是键值对,表示模板中对应的真实的值
from flask import render_template@app.route("/")
def hello():# 渲染模板return render_template('index.html')# 动态路由
@app.route("/user/<name>")
def user(name):return render_template('user.html', name=name) # name 第一个参数对应模板中的 {{name}} ,作为占位的租用,第二个参数则对应占位符的值
显示效果(根页面)
模板页面
2.2 变量
上面的示例中我使用了 {{ name }} 结构表示一个变量,它属于一种特殊的占位符,它会告诉模板这个位置的值从渲染模板时使用的数据获取
Jinjia2 可以识别所有类型的变量,甚至是一些复杂的数据结构,比如列表,字典和对象。下面一些示例使用
视图函数的内容渲染:
render_template 第一个参数对应的是模板文件名,随后的参数都是键值对,表示模板中对应的真实的值
@app.route("/test")
def test():isTrue = Truedata = {"name": "小黑","age": 18}ls = [1,2,3]return render_template('index.html',isTrue=isTrue,data=data,ls=ls)
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>我是第一个页面</title>
</head>
<body><h1>Hello World</h1><!--test 示例-->显示对象内容 {{data}}<br>显示对象中的姓名{{data.name}}<br>显示对象中的年龄 {{data.age}}<br>显示布尔值 {{isTrue}} <br>显示列表 {{ls}} <br>显示列表中的第一个数据 {{ls[0]}}
</body>
</html>
2.3 使用过滤器
在 Jinjia2 中可以使用过滤器修改变量
基本格式:竖线 + 关键字的形式显示
<!-- 首字母大写 -->
{{ name | capitalize}}
2.3.1 常见过滤器
2.3.2 使用过滤器
@app.route("/test")
def test():isTrue = Truedata = {"name": "gorit smith","age": 18}ls = [1,2,3]return render_template('index.html',isTrue=isTrue,data=data,ls=ls)
<p>使用过滤器:首字母大写,其他小写:{{data.name | capitalize}}</p><p>upper: 把值转换为 大写形式{{data.name | upper}}</p>
2.4 控制结构
从下面一段代码可以看出,在 jinjia2 中我们一样可以使用 Python 的语法来编写,只不过在条件判断中要加上一个判断的结尾,来告诉 flask 程序,这个网页模板中的判断条件结束了。
<!-- 访问对象可以使用 . 和 字典方式访问-->jinjia2 数据被隱藏了{#Jinjia2#}<h2>if 判断使用</h2><!-- 显示数据 ,显示 html 标签--><!-- -->{% if data.age < 18 %}{{data.name}}{% elif data.age == 18 %}do Something{% else %}{{data.age}}<a href=""></a>{% endif %}
2.5 循环语法
Jiajia2 模板中的循环语法是和 Python 中的 for 循环基本相似
<h2>for in 循环</h2>{% for foo in [1,2,3,4,5]%}{{foo}}<!--div 标签会显示三次--><div>111</div>{% endfor %}<h4>for 遍历字典</h4>{% for key,value in data.items() %}{{key}} {{value}}<br><!-- div 标签会显示三次--><div>111</div>{% endfor %}
2.6 访问静态文件
静态文件有很多,比如一个 html 文档, css文件, js 文件,图片等等都属于静态文件,在 Python Flask 当中,如果我们要是静态文件能够访问,就需要在根目录加上 一个 static 目录,然后使用 flask 中的 url_for() 函数指定静态文件的路径即可,下面来看一看具体的示例
我先定义类一个名为 img 的视图函数,让它加载 watch.html
@app.route('/watch')
def img():return render_template('watch.html')
让我在根目录里创建了一个 static 文件,专门存放一些静态文件
接下来是编写 watch.html 文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- 静态地址的访问使用 url_for 指定第一个参数,表示为静态文件,第二个参数为 filename,参数值是静态文件在 static 目录中的位置 --><p>显示静态文件 <img src="{{ url_for('static', filename='./my_blog.png') }}" width="50" ></p>
</body>
</html>
然后我们运行一下 flask,然后在根目录加上 /watch 就可以看到静态文件了
2.7 前端页面外联跳转
当我们使用 Flask 访问了一个不存在的页面时,Flask 就给我们返回一个 404 的页面,然后我们进入这个页面后,单击返回,就可以返回到主页,这里要怎么做呢?
其实很简单,我们可以使用 url_for(‘视图函数的名称就可以解决啦’)
<a href="{{url_for('web.index') }}">惩罚博主</a>
解释一下,我为什么前面要加一个 web, 因为我定义了一个名为 web 的 blueprint,所以需要加上 web 来解决跳转到主页的问题。
Python Flask 学习笔记 —— 二(路由,视图函数,jinjia2语法)相关推荐
- Webbench学习笔记二:getopt_long函数和build_request函数
目录 概述 1. main函数结构 2.getopt_long函数 2.1. 函数调用的几个参数 2.1.1. argc 2.1.2. argv 2.1.3. optstring 2.1.4. lon ...
- Flask学习笔记(二):基于Flask框架上传图片到服务器端并原名保存
文章目录 1.什么是Flask 2.通过Flask上传图片到服务器端(以原名保存) 1.什么是Flask Flask是一个基于python开发并依赖于 jinja2 模板和 werkzeug WSGI ...
- Programming Computer Vision with Python (学习笔记二)
首先介绍跟图像处理.显示有关两个库:NumPy和Matplotlib,然后介绍增强图像对比度的实现原理. NumPy NumPy是Python用于科学计算的基础库,提供了一些很有用的概念,如:N维数组 ...
- header python 环境信息_python获取网页header头部信息(python小白学习笔记二)
方法一:代码查看 通过python获取网页的链接url,返回码,以及相关的信息 #对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 import urllib.request ur ...
- 微擎学习笔记二--模板视图中标签的if和ifp
ifp 当前用户是否有 控制器--方法 的权限 包括add edit del send view等 方法必带 ifpp 当前用户是否有 插件 的权限 ife 当前用户是否有 控制器--方法 的权限 编 ...
- 【Java学习笔记之七】java函数的语法规则总结
函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...
- python自动化测试学习笔记合集二
python自动化测试学习笔记-4内置函数,处理json 函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改 ...
- python自动化测试学习笔记合集
python自动化测试学习笔记-1 一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行 ...
- python做直方图-python OpenCV学习笔记实现二维直方图
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...
- Python基础学习笔记之(二)
Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...
最新文章
- opencv 罗曼滤波_勒罗曼杜罗伊
- C语言再学习 -- 详解C++/C 面试题 1
- uva 11012——Cosmic Cabbages
- term和match查询总结(中文检索)
- Python小技巧:如何批量更新已安装的库?
- pycharm使用pip install安装速度慢,更换镜像源
- js 用指定字符分割字符串
- 基于esp32的物联网设计
- 2015061710 - 海豹突击队的忠告
- 全了!国内外知名互联网排名
- 史鉴使人明智;诗歌使人巧慧;数学使人精细;博物使人深沉;伦理之学使人庄重;逻辑与修辞使人善辩
- 互联网日报 | 7月1日 星期四 | 滴滴正式登陆纽交所;奈雪的茶上市首日破发;2021年铁路暑运今日正式启动...
- 怎么使用mp3转换器将mp4转换mp3格式
- 网络安全:使用各类编码混淆攻击
- 苹果youtube无法连接网络_苹果App Store无法连接?你只错在这一步
- HTTP协议 (一) HTTP协议详解
- java用scanner循环输入_Scanner怎么实现连续输入
- tf(Transform Frame)变换
- tansig与tanh激活函数
- 生成用python画一个正方形的代码
热门文章
- ButterKnife 懒人神器 使用步骤 备忘
- 解决node报错: jwt expired
- Mono.Cecil使用示例之给UnityEditor.dll中的ConsoleWindow添加双击委托
- 天大18年c语言离线作业,2018春 Python语言程序设计(天津大学仁爱学院)-中国大学mooc-题库零氪...
- 程序员对老板说:老子,明天不上班!结果...
- 跳槽面试时不能说的六大离职理由
- 封装获取一个URL地址问号后面传递的参数信息以及哈希值HASH 方法
- 自动驾驶仿真测试的意义
- cstimothy17-字段,属性,索引器,常量
- 苍蓝誓约服务器维护什么时候结束,《苍蓝誓约》12月10日09:30停服维护公告