Flask学习记录:在w3cschool资料的基础上的个人摘录、实践与总结
学习与转载自w3cschool,在w3cschool资料的基础上的个人摘录、实践与总结,如有错误望留言。
一、Flask 概述
2021-08-25 14:01 更新
1.1 什么是Web Framework?
Web Application Framework(Web应用程序框架)或简单的Web Framework(Web框架)表示一个库和模块的集合,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。
1.2 什么是Flask?
Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。
1.3 WSGI
Web Server Gateway Interface(Web服务器网关接口,WSGI)已被用作Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。
1.4 Werkzeug
它是一个WSGI工具包,它实现了请求,响应对象和实用函数。 这使得能够在其上构建web框架。 Flask框架使用Werkzeug作为其基础之一。
1.5 jinja2
jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。
Flask通常被称为微框架。 它旨在保持应用程序的核心简单且可扩展。Flask没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask支持扩展以向应用程序添加此类功能。一些受欢迎的Flask扩展将在本教程后续章节进行讨论。
二、Flask 环境
2022-04-22 18:53 更新
2.1为开发环境安装virtualenv
virtualenv是一个虚拟的Python环境构建器。它可以帮助用户并行创建多个Python环境。 因此,它可以避免不同版本的库之间的兼容性问题。
以下命令用于安装virtualenv:
pip install virtualenv
此命令需要管理员权限。您可以在Linux / Mac OS上的 pip 之前添加 sudo 。
如果您使用的是Windows,请以管理员身份登录。在Ubuntu上, virtualenv可以使用它的包管理器安装。
sudo apt-get install virtualenv
安装后,将在文件夹中创建新的虚拟环境。
mkdir newproj
cd newproj
virtualenv venv
要在 Linux / OS X 上激活相应的环境,请使用以下命令:
venv/bin/activate
要在 Windows 上激活相应的环境,可以使用以下命令:
venv\scripts\activate
我们现在准备在这个环境中安装Flask:
pip install Flask
上述命令可以直接运行,不需要系统范围安装的虚拟环境。
三、Flask 应用
2022-08-16 10:25 更新
为了测试 Flask 安装,请在编辑器中将以下代码输入 Hello.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
必须在项目中导入Flask模块。
Flask类的一个对象是我们的WSGI应用程序。
Flask构造函数使用当前模块(__name __)的名称作为参数。
Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。
app.route(rule, options)
- rule 参数表示与该函数的URL绑定。
- options 是要转发给基础Rule对象的参数列表。
在上面的示例中,'/ ' URL与hello_world()函数绑定。
因此,当在浏览器中打开web服务器的主页时,将呈现该函数的输出。
最后,Flask类的run()方法在本地开发服务器上运行应用程序。
app.run(host, port, debug, options)
所有参数都是可选的
序号 | 参数与描述 |
---|---|
1 | host 要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使服务器在外部可用 |
2 | port 默认值为5000 |
3 | debug 默认为false。 如果设置为true,则提供调试信息 |
4 | options 要转发到底层的Werkzeug服务器。 |
上面给出的Python脚本是从Python shell执行的。
python Hello.py
Python shell中的消息通知您:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在浏览器中打开上述URL(localhost:5000)。将显示“Hello World”消息。
这里注意,如果使用python自带的idle运行的时候可能会报以下错误:
Traceback (most recent call last):
File “C:/learn/python/xuexi/web/demoflask/app.py”, line 27, in
app.run();
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\app.py”, line 938, in run
cli.show_server_banner(self.env, self.debug, self.name, False)
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\flask\cli.py”, line 629, in show_server_banner
click.echo(message)
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click\utils.py”, line 217, in echo
file = _default_text_stdout()
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_compat.py”, line 621, in func
rv = wrapper_func()
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_compat.py”, line 385, in get_text_stdout
rv = _get_windows_console_stream(sys.stdout, encoding, errors)
File “C:\Users\zhang\AppData\Local\Programs\Python\Python36\lib\site-packages\click_winconsole.py”, line 261, in _get_windows_console_stream
func = _stream_factories.get(f.fileno())
io.UnsupportedOperation: fileno
只要不用idle执行就不会出错了,不影响后续使用。改用cmd下Python执行或者pycharm等运行都能成功。
调试模式
通过调用run()方法启动Flask应用程序。但是,当应用程序正在开发中时,应该为代码中的每个更改手动重新启动它。为避免这种不便,请启用调试支持。
如果代码更改,服务器将自行重新加载。它还将提供一个有用的调试器来跟踪应用程序中的错误。
在运行或将调试参数传递给run()方法之前,通过将application对象的debug属性设置为True来启用Debug模式。
app.debug = True
app.run()
app.run(debug = True)
四、Flask 路由
2021-08-19 18:02 更新
现代Web框架使用路由技术来帮助用户记住应用程序URL。
可以直接访问所需的页面,而无需从主页导航。
Flask中的route()装饰器用于将URL绑定到函数。例如:
@app.route('/hello')def hello_world():
return 'hello world'
在这里,URL '/ hello' 规则绑定到hello_world()函数。
因此,如果用户访问http://localhost:5000/hello ,
hello_world()函数的输出将在浏览器中呈现。
application对象的add_url_rule()函数也可用于将URL与函数绑定,如上例所示,使用route()。
装饰器的目的也由以下表示:
def hello_world():
return 'hello world'
app.add_url_rule('/', 'hello', hello_world)
五、Flask 变量规则
2022-08-16 10:36 更新
通过向规则参数添加变量部分,可以动态构建URL。
此变量部分标记为
它作为关键字参数传递给与规则相关联的函数。
在以下示例中,route()装饰器的规则参数包含附加到URL '/hello' 的
因此,如果在浏览器中输入http://localhost:5000/hello/w3cschool作为URL,则'w3cschool'将作为参数提供给 hello()函数。
from flask import Flask
app = Flask(__name__)
@app.route('/hello/<name>')
def hello_name(name):
return 'Hello %s!' % name
if __name__ == '__main__':
app.run(debug = True)
将上述脚本保存为hello.py并从终端运行它。
(YJ_py38) D:\szf\project\learn_flask>python Hello.py
* Serving Flask app 'Hello' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
接下来,打开浏览器并输入URL http://127.0.0.1:5000/hello/boshu。
以下输出将显示在浏览器中:
Hello boshu!
除了默认字符串变量部分之外,还可以使用以下转换器构建规则:
序号 | 转换器 | 描述 |
---|---|---|
1 | int | 接受整数 |
2 | float | 对于浮点值 |
3 | **path ** | 接受用作目录分隔符的斜杠 |
在下面的代码中,使用了所有这些构造函数:
from flask import Flask
app = Flask(__name__)
@app.route('/blog/<int:postID>')
def show_blog(postID):
return 'Blog Number %d' % postID
@app.route('/rev/<float:revNo>')
def revision(revNo):
return 'Revision Number %f' % revNo
if __name__ == '__main__':
app.run()
运行上面的代码。访问浏览器中的URL http://http😕/127.0.0.1:5000/blog/11。
给定的数字用作show_blog()函数的参数。浏览器显示以下输出:
Blog Number 11
在浏览器中输入此URL - http://localhost:5000/rev/2.5
revision()函数将浮点数作为参数。以下结果显示在浏览器窗口中:
Revision Number 2.500000
Flask的URL规则基于Werkzeug的路由模块。
这确保形成的URL是唯一的,并且基于Apache规定的先例。
考虑以下脚本中定义的规则:
from flask import Flask
app = Flask(__name__)
@app.route('/flask')
def hello_flask():
return 'Hello Flask'
@app.route('/python/')
def hello_python():
return 'Hello Python'
if __name__ == '__main__':
app.run()
这两个规则看起来类似,但在第二个规则中,结尾增加斜杠(/)更规范。一个规范的URL,使用 /python 或 /python/可以返回相同的输出。
但是,如果是第一个规则,/flask/ URL会产生“404 Not Found”页面。
六、Flask URL构建
2022-08-16 10:37 更新
url_for()函数对于动态构建特定函数的URL非常有用。
url_for()函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。
以下脚本演示了如何使用url_for()函数:
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/<name>')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest', guest = name))
if __name__ == '__main__':
app.run(debug = True)
上述脚本有一个函数hello_user (name),它接受来自URL的参数的值。
hello_user ()函数检查接收的参数是否与'admin'匹配。
如果匹配,则使用url_for()将应用程序重定向到hello_admin()函数,否则重定向到将接收的参数作为guest参数传递给它的hello_guest()函数。
运行。
打开浏览器并输入URL - http://localhost:5000/user/admin
浏览器中的应用程序响应是:
Hello Admin
在浏览器中输入以下URL - http://localhost:5000/user/boshu
应用程序响应现在更改为:
Hello boshu as Guest
七、Flask HTTP方法
2022-08-16 10:38 更新
HTTP协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。
下表总结了不同的http方法:
序号 | 方法与描述 |
---|---|
1 | GET以未加密的形式将数据发送到服务器。最常见的方法。 |
2 | HEAD和GET方法相同,但没有响应体。 |
3 | POST用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。 |
4 | PUT用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE 删除由URL给出的目标资源的所有当前表示。 |
默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。
为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。
将以下脚本另存为login.html
<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
现在在Python shell中输入以下脚本:
from flask import Flask, redirect, url_for, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("login.html")
@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
print(1)
user = request.form['nm']
return redirect(url_for('success',name = user))
else:
print(2)
user = request.args.get('nm')
return redirect(url_for('success',name = user))
if __name__ == '__main__':
app.run()
开发服务器开始运行后,在浏览器中打开login.html,在文本字段中输入name,然后单击提交。
表单数据将POST到表单标签的action子句中的URL。(#