Flask 环境搭建
需要安装Python ,Flask ,以及你开发需要用到的扩展。
Python 版本
这里安装最新版本的 Python 3 。Flask 支持 Python 3.4 及更高版本的 Python 3 、 Python 2.7 和 PyPy 。
虚拟环境
值得一提的是这个虚拟环境,其实就是搭建一个项目的过程。如果你使用专业版本的PyCharme 那么,自动创建的Flask 项目,就为你创建好了虚拟环境,就像AS 为你创建好Anroid 的项目结构,每个项目的Gradle 一样。
本意是Flask 不同项目可以安装不同的扩展,如果不使用虚拟环境就会安装在你系统Python 的库那里吧,这样你开别的Python 程序,可能用不到Flask 这些扩展,删除这些也不方便,与Python 的其他文件掺杂在一起了,所以就在自己的项目文件夹了安装,而不是在大环境里安装,感觉上是隔离的,称之为虚拟环境。
创建一个虚拟环境
这里是在Windows 上的命令,用的Python3 ,Mac 可以查看Flask 相关文档,
- 先创建一个文件夹,也就是你的项目文件夹,
- 在终端进入到该文件夹路径下,创建虚拟环境,命令如下,
py -3 -m venv venv
- 激活虚拟环境
venv\Scripts\activate
激活后,你的终端提示符会显示虚拟环境的名称。例如,(venv) D:\pyweb>
安装 Flask
在已激活的虚拟环境下使用如下命令安装Flask ,
pip install Flask
这样由于是在虚拟环境下安装的会安装到项目的venv 目录下,不会安装到Python 大环境,这样也就影响最小,实在不行,你可以把项目删除,就删干净了,不会留下很多之后用不到的库;这样你的项目的库会在venv 文件夹里。
这样Flask 的环境搭建就完成了,项目文件结构可以如下,
/pyweb
├── static/
├── templates/
├── venv/
└── main.py
简单说一下 static 文件夹,可放css 文件,templates 可放html 文件,venv 是项目的库,main.py 可以写Python 代码了。
简单使用
一个最小的应用
可以很少的代码搭建起 Flask 应用如下:
# 1. 导入Flask
from flask import Flask
# 2. 创建Flask 应用程序实例
# 需要传入 __name__ 来确定资源所在路径
app = Flask(__name__)
# 3. 定义路由及视图函数
@app.route('/')
def hello_world():
return 'Hello, World!'
# 4. 启动程序
if __name__ == '__main__':
app.run()
然后直接运行Python 文件就可以跑起来,
(venv) D:\pyweb>Python main.py
* Serving Flask app "main" (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)
我们访问http://127.0.0.1:5000/,

set FLASK_ENV=development
这样在命令行执行一下就可以了。
路由
路由的简单定义,模板如下,
@app.route('/hello')
def hello():
a = 10
b = 2
c = 2
result = (a+b)/c
return "<h1>雷浩</h1> %d" % result
那运行,访问http://127.0.0.1:5000/hello ,

指定请求方式,默认支持GET 请求,
@app.route('/', methods=['GET','POST'])
def hello_world():
return 'Hello, World!'
使用render_template
如果你想要让路由返回html 页面,那么就要用到render_template 这个模块了,引入该模块,
from flask import render_template
在templates 文件夹创建html 文件,如hello.html ,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>天天生鲜</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
在Python 使用render_template 可以很方便找到并处理templates 文件夹下的html 文件,
@app.route('/hello')
def hello():
# 这样就会自动去找templates 文件夹的hello.html 文件
return render_template("hello.html")
访问一下,效果如下,

页面传值
在Python 文件,把一个变量发送到html 页面。
路由如下,
@app.route('/arg')
def arg():
value = "arg0"
return render_template("hello.html", value = value)
hello.html 文件修改如下,
<body>
<h1>你好,欢迎来到天天生鲜!</h1>
<hr/>
<a> 接收Flask 传过来的变量{{ value }}</a>
</body>

列表,字典也都可以传过去,
@app.route('/arg')
def arg():
my_list = ["电影", "电视剧", "音乐"]
my_dict = {
'name': 'Sam',
'age': 18
}
return render_template("hello.html", my_list = my_list, my_dict = my_dict)
在html 文件的同样的处理思路,
<body>
<h1>你好,欢迎来到天天生鲜!</h1>
<hr/>
<h2>列表</h2>
{% for item in my_list %}
{{item}} <br/>
{% endfor %}
<hr/>
<h2>字典</h2>
{{ my_dict }} <br/>
{{ my_dict.name }} <br/>
{{ my_dict['age'] }} <br/>
</body>

路由访问传值
如这里使用同一个视图函数,来显示不同信息,
# <> 定义路由的参数,<> 里是在访问时传入的
# 如这里使用同一个视图函数,来显示不同的书名信息
@app.route('/book/<name>')
def book(name):
# 要想在函数里使用,则函数的参数要声明,如name
return "book name is %s" % name
你还可以限制类型,<int:order_id> 这样就限制order_id 为int 了
@app.route('/orders/<int:order_id>')
def orders_id(order_id):
return "order id %s" % order_id
访问http://127.0.0.1:5000/orders/2 如下,

处理POST 请求
之前路由的使用是处理了GET ,这里我们来看一下如何处理POST 请求, 以一个简单的登录为例,看一下, 导入request 模块,
from flask import request
这里只是看POST 请求,所以省去数据逻辑,模拟一个登录操作,账号123 ,密码321 ,
@app.route('/login',methods = ['POST'])
def login():
# 接收用户名与密码
# 从请求里拿到数据,需要用到request
# form 就可以理解为一个字典啦
username = request.form.get("username")
pwd = request.form.get("pwd")
# url 传参这么可以接收
# request.url.get()
if username == "123" and pwd == "321":
return "登录成功"
else:
return render_template("login.html",hint = "请检查用户名或密码")
在templates 创建login.html 文件,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>天天生鲜</title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="pwd"><br>
<input type="submit" value="登录"><br>
{{hint}}
</form>
</body>
</html>
这里涉及到一个表单的写法,就提一下,action="/login" 指了明点击提交后,将数据提交到那个路由;

输入设置的用户名,密码,就可以显示登录成功。
定义一个JSON 接口
有很多方法返回JSON 数据,这里写一种示范, 导入jsonify 模块,
from flask import jsonify
@app.route("/data", methods=['POST', "GET"])
def data():
if request.method == "POST":
data = request.get_json()
d1 = data['d1']
d2 = data['d2']
return jsonify({"hello": d1 + " and " + d2})
return jsonify({"hello": "get ok"})
在浏览器直接访问http://127.0.0.1:5000/data ,返回GET 请求下的数据,
