Flask 初学

535 阅读5分钟

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 相关文档

  1. 先创建一个文件夹,也就是你的项目文件夹,
  2. 在终端进入到该文件夹路径下,创建虚拟环境,命令如下,
py -3 -m venv venv
  1. 激活虚拟环境
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 请求下的数据,