Flask 学习笔记
_Star_Universe_ · · 科技·工程
前情提要:我在这篇文章中预告过会讲一些 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!'
@app.route('/')
:装饰器,用于定义路由。/
表示根 URL。def home()
:视图函数,当访问根 URL 时,返回Welcome to the Home Page!
。
路由参数
路由可以包括动态部分,通过在路由中指定参数,可以将 URL 中的部分数据传递给视图函数。
@app.route('/greet/<name>')
def greet(name):
return f'Hello, {name}!'
观察到函数名就是上面定义的 /greet
路由,下面返回值中的 {name}
则对应上面的 <name>
参数。
路由规则
路由规则支持不同类型的参数和匹配规则。举例:
<int:user_id>
:匹配整数类型的user_id
。<path:filename>
:匹配包含斜杠的路径filename
。
如果不自行指定参数类型会默认是字符串。如果自行转换可以有如下方式:
int
: 匹配整数。float
: 匹配浮点数。path
: 匹配任意路径,包括斜杠。
请求方法
Flask 路由支持不同的 HTTP 请求方法,如 GET
和 POST
等。可以通过 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>
几个重点:
action="/save"
:表单数据提交到/save
路径。method="post"
:使用 POST 方法提交数据。
其次再完成对应的 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 框架入门教程(非常详细)从零基础入门到精通。