超实用的Flask入门基础教程,新手必备!

您所在的位置:网站首页 flash入门教程 超实用的Flask入门基础教程,新手必备!

超实用的Flask入门基础教程,新手必备!

2024-06-30 16:43:53| 来源: 网络整理| 查看: 265

Flask入门基础教程 Flask简介安装Flask依赖创建虚拟环境激活虚拟环境安装Flask 基础介绍路由变量规则唯一 URL / 重定向行为构建URLHTTP方法 Request对象静态文件模板渲染模板继承访问请求数据本地环境请求对象文件上传Cookies 重定向和错误响应JSON 格式的 API会话消息闪现日志 部署到 Web 服务器

Flask简介

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

安装Flask 依赖

当安装 Flask 时,以下配套软件会被自动安装:

Werkzeug 用于实现 WSGI 是一个 WSGI(在 Web 应用和多种服务器之间的标准 Python 接口) 工具集。jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。MarkupSafe 与 Jinja 共用,在渲染页面时用于避免不可信的输入,防止注入攻击。ItsDangerous 保证数据完整性的安全标志数据,用于保护 Flask 的 session cookie.Click 是一个命令行应用的框架。用于提供 flask 命令,并允许添加自定义 管理命令。 创建虚拟环境

创建文件夹,在文件夹下面 输入命令

>python -m venv venv_name 激活虚拟环境

激活这个虚拟环境(注意,使用的是虚拟环境的话前面会有(venv_name)这个显示的,不然就是没有激活虚拟环境。)

>venv_name\Scripts\activate 安装Flask

在已激活的虚拟环境中使用pip安装Flask

pip install Flask 基础介绍

在Flask中,最基础的一个功能是这样子的

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000) 首先,我们导入了Flask类。其次我们创建了Flask的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main’ 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等。route()是一个路由,其实是一个装饰器,在其中输入URL,会帮我们在这个URL下执行对应的方法。接着是函数主体,可以写方法也可以调用其他方法的返回值,最后返回到浏览器上显示的信息最后我们用 run() 函数来让应用运行在本地服务器上。 其中 if name ==‘main’: 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。debug=True开启了调试模式,相当于在发生错误时提供一个相当有用的调试器。host=’0.0.0.0‘可以允许同一个局域网内别的用户访问,这个方法让操作系统监听所有公网 IP。port自定义端口。 路由

现代Web框架使用路由技术来帮助用户记住应用程序URL。可以直接访问所需的页面,而无需从主页导航。Flask中的route()装饰器用于将URL绑定到函数。例如:

@app.route('/index') def index(): return 'This is a index page...

在这里,URL ‘/ index’ 规则绑定到index()函数。 因此,如果用户访问127.0.0.1:5000/index,index()函数的输出将在浏览器中呈现。

变量规则

通过把 URL 的一部分标记为 就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用 converter:variable_name ,可以 选择性的加上一个转换器,为变量指定规则。请看下面的例子:

@app.route('/user/') def show_user_profile(username): # show the user profile for that user return 'User %s' % escape(username) @app.route('/post/') def show_post(post_id): # show the post with the given id, the id is an integer return 'Post %d' % post_id @app.route('/path/') def show_subpath(subpath): # show the subpath after /path/ return 'Subpath %s' % escape(subpath)

转换器类型:

类型说明string(缺省值) 接受任何不包含斜杠的文本int接受正整数float接受正浮点数path类似string,但可以包含斜杠uuid接受UUID字符串 唯一 URL / 重定向行为

Flask的URL规则是基于Werkzeug的路由模块。模块背后的思想是基于 Apache 以及更早的 HTTP 服务器主张的先例,保证优雅且唯一的 URL。

@app.route('/projects/') def projects(): return 'The project page' @app.route('/about') def about(): return 'The about page'

访问第一个路由不带/时,Flask会自动重定向到正确地址。 访问第二个路由时末尾带上/后Flask会直接报404 NOT FOUND错误。

永久性重定向和暂时性重定向 flask是通过flask.redirect(location,code=302)这个函数来实现重定向的,location是需要重定向到的url,应该配合之前讲的在url_for()函数来使用,code表示哪种重定向,默认302,也即暂时性重定向,301是永久性重定向.

构建URL

如果 Flask 能匹配 URL,那么 Flask 可以生成它们吗?当然可以。你可以用 url_for()来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。 例如,这里我们使用 test_request_context() 方法来尝试使用 url_for() 。 test_request_context() 告诉 Flask 正在处理一个请求,而实际上也许我们正处在交互 Python shell 之中, 并没有真正的请求。

from flask import Flask, url_for app = Flask(__name__) @app.route('/') def index(): return 'index' @app.route('/login') def login(): return 'login' @app.route('/user/') def profile(username): return '{}\'s profile'.format(escape(username)) with app.test_request_context(): print(url_for('index')) #输出 / print(url_for('login')) #输出 /login print(url_for('login', next='/')) #输出 /login?next=/ print(url_for('profile', username='John Doe')) #输出 /user/John%20Doe

那么为什么不在把 URL 写死在模板中,而要使用反转函数 url_for() 动态构建?

反转通常比硬编码 URL 的描述性更好。你可以只在一个地方改变 URL ,而不用到处乱找。URL 创建会为你处理特殊字符的转义和 Unicode 数据,比较直观。生产的路径总是绝对路径,可以避免相对路径产生副作用。如果你的应用是放在 URL 根路径之外的地方(如在 /myapplication 中,不在 / 中), url_for() 会为你妥善处理。 HTTP方法

Web 应用使用不同的 HTTP 方法处理 URL 。当你使用 Flask 时,应当熟悉 HTTP 方法。 缺省情况下,一个路由只回应 GET 请求。 可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法:

from flask import request @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form()

如果当前使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,并且同时还会 按照 HTTP RFC 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。 HTTP 方法(也经常被叫做“谓词”)告知服务器,客户端想对请求的页面 做 些什么。下面的都是非常常见的方法:

GET:浏览器告知服务器:只 获取 页面上的信息并发给我。这是最常用的方法。HEAD:浏览器告诉服务器:欲获取信息,但是只关心 消息头。应用应像处理 GET 请求一样来处理它,但是不分发实际内容。在 Flask 中你完全无需 人工 干预,底层的 Werkzeug 库已经替你打点好了。POST:浏览器告诉服务器:想在 URL 上 发布 新信息。并且,服务器必须确保 数据已存储且仅存储一次。这是HTML 表单通常发送数据到服务器的方法。PUT:类似 POST 但是服务器可能触发了存储过程多次,多次覆盖掉旧值。你可能会问这有什么用,当然这是有原因的。考虑到传输中连接可能会丢失,在 这种 情况下浏览器和服务器之间的系统可能安全地第二次接收请求,而不破坏其它东西。因为 POST它只触发一次,所以用 POST是不可能的。DELETE:删除给定位置的信息。OPTIONS:给客户端提供一个敏捷的途径来弄清这个 URL 支持哪些 HTTP 方法。从 Flask 0.6 开始,实现了自动处理。 Request对象 from flask import Flask,jsonify from flask import request @app.route('/api/add', methods=['POST']) def add_elasticsearch(): city_name = request.form.get('city_name') diagnose_people = request.form.get('diagnose_people') suspect_people = request.form.get('suspect_people') death_people = request.form.get('death_people') cure_people = request.form.get('cure_people') result = main.FuncUtil.add_es(city_name, diagnose_people, suspect_people, death_people, cure_people) return jsonify(result)

request中”method”变量可以获取当前请求的方法,即”GET”, “POST”, “DELETE”, “PUT”等。”form”变量是一个字典,可以获取Post请求表单中的内容,如果提交的表单中不存在,则会返回一个”KeyError”,你可以不捕获,页面会返回400错误(想避免抛出这”KeyError”,你可以用request.form.get(“user”)来替代)。而”request.args.get()”方法则可以获取Get请求URL中的参数,该函数的第二个参数是默认值,当URL参数不存在时,则返回默认值。在后文的请求对象会讲到。

静态文件

动态 web 应用也会需要静态文件,通常是 CSS 和 JavaScript 文件。理想状况下, 你已经配置好 Web 服务器来提供静态文件,但是在开发中,Flask 也可以做到。 只要在你的包中或是模块的所在目录中创建一个名为 static 的文件夹,在应用中使用 /static 即可访问。 给静态文件生成 URL ,使用特殊的 ‘static’ 端点名:

url_for('static', filename='style.css')

这个文件应该存储在文件系统上的 static/style.css 。

模板渲染

Flask的模板功能是基于Jinja2模板引擎实现的。让我们来实现一个例子。修改之前的Flask运行文件,代码如下:

from flask import Flask,render_template app = Flask(__name__) @app.route('/hello/') def hello_world(name=None): return render_template('hello.html', name=name) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000)

这段代码”hello()”函数并不是直接返回字符串,而是调用了”render_template()”方法来渲染模板。方法的第一个参数”hello.html”指向你想渲染的模板名称,第二个参数”name”是你要传到模板去的变量,变量可以传多个。接下来我们创建模板文件。在当前目录下,创建一个子目录”templates”(注意,一定要使用这个名字)。然后在”templates”目录下创建文件”hello.html”,内容如下:

Hello Reader {% if name %} Hello {{ name }}! {% else %} Hello World! {% endif %}

这是一个HTML模板,根据”name”变量的值,显示不同的内容。变量或表达式由”{{ }}”修饰,而控制语句由”{% %}”修饰,其他的代码,就是我们常见的HTML。打开浏览器,输入”http://127.0.0.1:5000/hello/Reader”,页面上即显示大标题”Hello Reader !”。

模板继承

一般我们的网站虽然页面多,但是很多部分是重用的,比如页首,页脚,导航栏之类的。对于每个页面,都要写这些代码,很麻烦。Flask的Jinja2模板支持模板继承功能,省去了这些重复代码。让我们基于上面的例子,在”templates”目录下,创建一个名为”layout.html”的模板:

!doctype html> Hello xxx


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭