Flask 学习笔记

· · 科技·工程

前情提要:我在这篇文章中预告过会讲一些 Flask 使用技巧,但是因为一些原因拖更了几期,所以笔者现在就来把这个空洞补上。

首先给出一段我写的代码(可能与下文有一定区别):

from flask import *
from pickle import *
app = Flask(__name__)
# 存在这个 pickle
try:
    with open("users.pickle","rb") as f:     
        users=load(f)
# 不存在这个 pickle
except:
    users={}
# 根路由
@app.route('/')
def index():
    return render_template('index.html')
# methods = ["get","post"] 说明接受这两种请求
@app.route('/save',methods=["get","post"])
def register():
    # 使用 request.files.get() 获取名为 "picture" 的文件输入框
    obj=request.files.get("picture")
    fname=obj.filename
    url="static/images/"+fname
    obj.save(url)
    user=request.values.get("user")
    # 使用 request.values.get() 获取名为 "pwd" 的密码输入框
    pwd=request.values.get("pwd")
    pwd2=request.values.get("pwd2")
    # 获取选择的性别
    sex=request.values.get("sex")
    if pwd==pwd2:
        users[user]=[pwd,sex,url]
        with open("users.pickle","wb") as f:
            dump(users,f)
        return "<p>获取到你的注册信息</p>"+"<p>用户名为:"+user+"</p>"+"<p>密码为:"+pwd+"</p>"+"<p>性别为:"+sex+"</p>"+"头像为:<img src='/"+url+"'>"+"<p>以上数据都永久性保存到 pickle 文件中了</p>"
    else:
        return render_template('index.html',error="两次输入的密码不一致")
app.run()

Flask 引入

Flask 是一个用 Python 编写的轻量级 Web 应用框架。

Flask 基于 WSGI(Web Server Gateway Interface)和 Jinja2 模板引擎,旨在帮助开发者快速、简便地创建 Web 应用。

Flask 被称为"微框架",因为它使用简单的核心,用扩展增加其他功能。

Flask 是 Python 中的一个库,它的安装较简单,不讲了。

重点是框架代码,首先创建一个 Flask 并输入如下代码:

from flask import Flask # 从 flask 模块中导入了 Flask 类
  app = Flask(__name__) # 创建一个 Flask 应用实例

@app.route("/") # 告诉 Flask 哪个 URL 应该触发下面的函数。这里是根 URL
def hello(): # 定义了一个名为 hello_world 的函数
    return "Hello World!" # hello_world 函数返回值

if __name__ == "__main__": # 一个条件判断,用于检查这个模块是否被直接运行
    app.run() # 调用 Flask 应用实例的 run 方法

打开浏览器,并访问 http://127.0.0.1:5000/,应该会看到 Hello, World! 的消息,表示 Flask 已成功安装并运行。

Flask 路由

基本路由定义

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Welcome to the Home Page!'

路由参数

路由可以包括动态部分,通过在路由中指定参数,可以将 URL 中的部分数据传递给视图函数。

@app.route('/greet/<name>')
def greet(name):
    return f'Hello, {name}!'

观察到函数名就是上面定义的 /greet 路由,下面返回值中的 {name} 则对应上面的 <name> 参数。

路由规则

路由规则支持不同类型的参数和匹配规则。举例:

如果不自行指定参数类型会默认是字符串。如果自行转换可以有如下方式:

请求方法

Flask 路由支持不同的 HTTP 请求方法,如 GETPOST 等。可以通过 methods 参数指定允许的请求方法。

给出一个示例:

@app.route('/say', methods=['get','post'])
def say():
    return 'Form submitted!'

需要说明的是 post 要比 get 更安全,因为 get 会可能将你输入的信息暴露在网址栏中,而 post 不会,所以一些需要登录的网站都使用 post,打个比方就像是前者用卡车运送数据,后者用货车运送数据。

最后提一下,Flask 按照定义的顺序匹配路由,第一个匹配成功的路由将被处理。确保更具体的路由放在更一般的路由之前。

由于作者水平有限,关于路由的知识到这里就结束了。

Flask 表单处理

本栏讲一下注册账号模板代码。

首先完成一个 form 表单(为了方便读者理解删掉了一个看不懂的属性):

<form action="/save" method="post" <!--...-->>
    <p>上传头像:<input type="file" name="picture" required></p>
    <p>用 户 名:<input name="user" required></p>
    <p>密    码:<input type="password" name="pwd" required></p>
    <p>再次输入:<input type="password" name="pwd2" required></p>
    <p>性    别:
        <input name="sex" type="radio" value="girl">女
        <input name="sex" type="radio" value="boy">男
    </p>
    <button>提交</button>
</form>

几个重点:

其次再完成对应的 app.py 代码:

def register():
    # 使用 request.files.get() 获取名为 "picture" 的文件输入框
    obj=request.files.get("picture")
    fname=obj.filename
    url="static/images/"+fname
    obj.save(url)
    user=request.values.get("user")
    # 使用 request.values.get() 获取名为 "pwd" 的密码输入框
    pwd=request.values.get("pwd")
    pwd2=request.values.get("pwd2")
    # 获取选择的性别
    sex=request.values.get("sex")
    # 两次输入密码一致
    if pwd==pwd2:
        users[user]=[pwd,sex,url]
        # 记下 user 的信息
        with open("users.pickle","wb") as f:
            dump(users,f)
        return "<p>获取到你的注册信息</p>"+"<p>用户名为:"+user+"</p>"+"<p>密码为:"+pwd+"</p>"+"<p>性别为:"+sex+"</p>"+"头像为:<img src='/"+url+"'>"+"<p>以上数据都永久性保存到 pickle 文件中了</p>"
    # 两次密码不一致
    else:
        return render_template('index.html',error="两次输入的密码不一致")

指令 request.form.get("user") 用于提交表单数据,两个 . 之间的那个单词是可以改的,具体要看输入的数据是什么类型。

致谢 & 参考资料

感谢 RUNOOB 提供的丰富的学习资源,最近几期都有较多引用,如有侵权请联系我撤下并赔礼道歉。

可参考的文章:Flask 框架入门教程(非常详细)从零基础入门到精通。