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 中指定参数,然后我们在地址栏输入的参数就可以显示到网页当中,只需使用特定的语法就可以实现

  1. 传入动态参数
  2. 传入默认参数

这里补充一点点内容,一个 视图函数可以绑定多个 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语法)相关推荐

  1. 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 ...

  2. Flask学习笔记(二):基于Flask框架上传图片到服务器端并原名保存

    文章目录 1.什么是Flask 2.通过Flask上传图片到服务器端(以原名保存) 1.什么是Flask Flask是一个基于python开发并依赖于 jinja2 模板和 werkzeug WSGI ...

  3. Programming Computer Vision with Python (学习笔记二)

    首先介绍跟图像处理.显示有关两个库:NumPy和Matplotlib,然后介绍增强图像对比度的实现原理. NumPy NumPy是Python用于科学计算的基础库,提供了一些很有用的概念,如:N维数组 ...

  4. header python 环境信息_python获取网页header头部信息(python小白学习笔记二)

    方法一:代码查看 通过python获取网页的链接url,返回码,以及相关的信息 #对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 import urllib.request ur ...

  5. 微擎学习笔记二--模板视图中标签的if和ifp

    ifp 当前用户是否有 控制器--方法 的权限 包括add edit del send view等 方法必带 ifpp 当前用户是否有 插件 的权限 ife 当前用户是否有 控制器--方法 的权限 编 ...

  6. 【Java学习笔记之七】java函数的语法规则总结

    函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...

  7. python自动化测试学习笔记合集二

    python自动化测试学习笔记-4内置函数,处理json 函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改 ...

  8. python自动化测试学习笔记合集

    python自动化测试学习笔记-1 一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行 ...

  9. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  10. Python基础学习笔记之(二)

    Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...

最新文章

  1. opencv 罗曼滤波_勒罗曼杜罗伊
  2. C语言再学习 -- 详解C++/C 面试题 1
  3. uva 11012——Cosmic Cabbages
  4. term和match查询总结(中文检索)
  5. Python小技巧:如何批量更新已安装的库?
  6. pycharm使用pip install安装速度慢,更换镜像源
  7. js 用指定字符分割字符串
  8. 基于esp32的物联网设计
  9. 2015061710 - 海豹突击队的忠告
  10. 全了!国内外知名互联网排名
  11. 史鉴使人明智;诗歌使人巧慧;数学使人精细;博物使人深沉;伦理之学使人庄重;逻辑与修辞使人善辩
  12. 互联网日报 | 7月1日 星期四 | 滴滴正式登陆纽交所;奈雪的茶上市首日破发;2021年铁路暑运今日正式启动...
  13. 怎么使用mp3转换器将mp4转换mp3格式
  14. 网络安全:使用各类编码混淆攻击
  15. 苹果youtube无法连接网络_苹果App Store无法连接?你只错在这一步
  16. HTTP协议 (一) HTTP协议详解
  17. java用scanner循环输入_Scanner怎么实现连续输入
  18. tf(Transform Frame)变换
  19. tansig与tanh激活函数
  20. 生成用python画一个正方形的代码

热门文章

  1. ButterKnife 懒人神器 使用步骤 备忘
  2. 解决node报错: jwt expired
  3. Mono.Cecil使用示例之给UnityEditor.dll中的ConsoleWindow添加双击委托
  4. 天大18年c语言离线作业,2018春 Python语言程序设计(天津大学仁爱学院)-中国大学mooc-题库零氪...
  5. 程序员对老板说:老子,明天不上班!结果...
  6. 跳槽面试时不能说的六大离职理由
  7. 封装获取一个URL地址问号后面传递的参数信息以及哈希值HASH 方法
  8. 自动驾驶仿真测试的意义
  9. cstimothy17-字段,属性,索引器,常量
  10. 苍蓝誓约服务器维护什么时候结束,《苍蓝誓约》12月10日09:30停服维护公告