Flask入门-基于Ubuntu+Py3.85环境
调试命令
export FLASK_ENV=development # 打开调试模式
flask run –host=0.0.0.0 # 设置运行后,所有主机可见
pycharm设置调试
app.run(debug=True)
一、创建虚拟环境&激活虚拟环境&安装Flask
虚拟环境
建议在开发环境和生产环境下都使用虚拟环境来管理项目的依赖。
为什么要使用虚拟环境?随着你的 Python 项目越来越多,你会发现不同的项目会需要 不同的版本的 Python 库。同一个 Python 库的不同版本可能不兼容。
虚拟环境可以为每一个项目安装独立的 Python 库,这样就可以隔离不同项目之间的 Python 库,也可以隔离项目与操作系统之间的 Python 库。
Python 3 内置了用于创建虚拟环境的
venv
模块。如果你使用的是较新的 Python 版本,那么请接着阅读本文下面的内容。如果你使用 Python 2 ,请首先参阅 安装 virtualenv 。
1.创建虚拟环境
mkdir myproject # 创建一个文件
cd myproject # 进入这个文件
python3 -m venv venv # 创建一个名叫venv的虚拟环境
2.激活虚拟环境
在myproject文件夹下执行:
. venv/bin/activate
激活后,你的终端提示符会显示虚拟环境的名称。
3.安装Flask
在已激活的虚拟环境中可以使用如下命令安装 Flask:
pip install Flask
二、requirements文件的使用
1.导出环境所使用的所有模块名和版本号
pip freeze > requirements.txt # requirements.txt这个文件名可以自定义。
创建一个Flask项目,选好虚拟环境,随便创建一个程序,然后在终端执行代码
即可导出这个虚拟环境所使用的所有模块和版本号。
2.查看虚拟环境安装了那些模块
pip list
3.批量导入别的虚拟环境中的所有模块
- 即将一个虚拟环境里所有安装的模块安装到指定的环境中。
pip install -r requirements.txt # requirements.txt 这个代表包含模块和版本号的文本文件。
执行命令之后,会将requirements.txt中所有的模块依次安装。
三、创建第一个Flask程序
1.Flask第一个程序
from flask import Flask # 导入Flask模块
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
运行结果:
FLASK_APP = app.py
FLASK_ENV = development
FLASK_DEBUG = 0
In folder /Python/Flask
/Python/myproject/venv/bin/python3 -m flask run
* Serving Flask app 'app.py' (lazy loading)
* Environment: development
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
此时点击Running on http://127.0.0.1:5000会跳转到浏览器,浏览器显示即:
和函数hello_world的返回结果是一样的。
2.代码详解
from flask import Flask # 导入Flask模块
# 创建Flask应用程序实例
app = Flask(__name__) # 需要传入__name__,为了确定资源所在的路径。--后面会有具体解释
# 定义路由及视图函数
# Flask中定义路由是通过装饰器实现的。
@app.route('/') # '/'代表根目录,即打开链接的第一界面。访问根路由会直接执行下面的函数。
def hello_world():
return 'Hello, World!'
# 启动程序
if __name__ == '__main__': # 判断__name__是否等于__main__
# 执行了app.run,就会将Flask程序运行在一个简易的服务器(Flask提供的,由于测试的。)
app.run() # 运行程序,
3.函数返回的形式
函数返回有2中形式:
- 一是上面代码中的return ‘Hello World’,即返回的是字符串。
- 二是返回一个网页。
返回网页的方法:
在项目文件夹下的templates创建一个index.html的文件,里面的内容为你想在网页里显示出来的内容。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Hello HTML5</h1> <!--用一级标题显示'Hello HTML5'--> </body> </html>
将from flask import Flask更改为from flask import Flask,render_template,其实就是多导入了一个templates。
from flask import Flask,render_template
- 然后将函数的返回代码改为return render_template(‘index.html’),括号里的内容为要显示的网页的文件名。
def hello_world(): # return 'Hello World!' return render_template('index.html')
完整程序代码:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
# return 'Hello World!'
return render_template('index.html')
if __name__ == '__main__':
app.run()
运行结果:
四.路由请求方式设置
1.postman软件
- 直接官网下载然后打开,打开软件直接跳过,登录的下方有skip字样,点击就可以进入下图界面。
- 试用软件发送get请求,查看返回结果。
发现结果是正确的。
- 再用软件选择Post发送请求,查看返回结果。
发现报了一个405的错误,即方法不允许,服务不支持post请求。
2.创建post请求
默认是Get请求,如果需要增加,需要自行指定。
将装饰器语句改成:
@app.route('/',methods=['Get','Post'])
即加上请求方式参数,多个请求方式要用列表。
修改完成之后,再次发送post请求:
发现并没有报错,和Get请求返回的结果是相同的,说明网页支持了Post请求了。
五、路由参数处理
1.同一个视图函数来显示不同用户的订单信息。
有时需要将同一类URL映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的订单信息。
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/',methods=['Get','Post'])
def hello_world():
# return 'Hello World!'
return render_template('index.html')
# 使用同一个视图函数来显示不同用户的订单信息。
# <>定义路由的参数。<>内需要起个名字,那么后面的代码才能使用。
@app.route('/orders/<order_id>')
def get_order_id(order_id): # 需要在视图的()内填入参数名,那么后面的代码才能去使用。
return 'order_id %s' % order_id
# 启动程序
if __name__ == '__main__':
app.run()
上面的代码是在之前代码的基础上又定义了一个路由,目录为’/orders/
上面代码运行后跟之前运行结果没有区别,但是在地址栏后面加上/orders/xxx,例如http://127.0.0.1:5000/orders/666
按F5刷新后的效果为:
可以发现显示内容为order_id 666,即get_order_id(order_id)函数的返回结果一致。
在get_order_id(order_id)函数中增加:print(order_id),然后运行程序,执行结果为:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/',methods=['Get','Post'])
def hello_world():
# return 'Hello World!'
return render_template('index.html')
# 使用同一个视图函数来显示不同用户的订单信息。
# <>定义路由的参数。<>内需要起个名字,那么后面的代码才能使用。
@app.route('/orders/<order_id>')
def get_order_id(order_id):
# 需要在视图的()内填入参数名,那么后面的代码才能去使用。
print(type(order_id))
return 'order_id %s' % order_id
# 启动程序
if __name__ == '__main__':
app.run()
可以看到打印出了<class ‘str’>,说明函数的参数order_id默认是一个字符串形式。
2.对路由做访问优化
有的时候,需要对路由做访问优化,订单ID应该是一个int类型。
所以我们将**@app.route(‘/orders/
即将order_id转化为int类型。当order_id可以转化为int类型时,就进行匹配,反之。此时,只有在http://127.0.0.1:5000/orders/xxx的xxx位置的参数是**可以转化为int类型**时,才会有返回结果,否则就是**Note Found**
举一反三:int也可以改成float等等
string |
(缺省值) 接受任何不包含斜杠的文本 |
---|---|
int |
接受正整数 |
float |
接受正浮点数 |
path |
类似 string ,但可以包含斜杠 |
uuid |
接受 UUID 字符串 |
六、Jinja2模块引擎
模板
视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。
- 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取
- 使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”
- Flask是使用 Jinja2 这个模板引擎来渲染模板
使用模板的好处:
- 视图函数只负责业务逻辑和数据处理(业务逻辑方面)
- 而模板则取到视图函数的数据结果进行展示(视图展示方面)
- 代码结构清晰,耦合度低
Jinja2
两个概念:
- Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
- 模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。
渲染模版函数
- Flask提供的 render_template 函数封装了该模板引擎
- render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
1.如何返回一个网页(模板)
- 这一部分在目录 三–3提过一次,但不详细
创建完Flask项目后会生成2个文件夹static和templates,其中static可以将图片或者一些其他东西放进去,而templates就是用来放模板的。
右键templates目录,新建一个HTML文件,随便写一些内容。
然后导入模块from flask import Flask,render_template
将函数返回结果设置为:return render_template(‘index.html’),其中‘index.html’为需要显示网页名,可自行修改。
Python代码:
from flask import Flask,render_template
app = Flask(__name__)
# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/')
def hello_world():
return render_template('index.html')
if __name__ == '__main__':
app.run()
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
这个是模板<br>
这个是首页
</body>
</html>
运行结果:
可以看到显示的是网页的内容。
2.传入一个可变的东西
即在模板中不直接写死的东西:
@app.route('/')
def hello_world():
# 比如需要传入网址
url_str = 'www.baidu.com'
return render_template('index.html',url_str=url_str) # 后面的参数为键值对的形式
==========================================================================
```html
Title
这个是模板
这个是首页
{{ url_str }}
# 加入了{{url_str}}