Flask入门学习
安装:pip install flask
入门教程地址:https://helloflask.com/book/3/
本书源码:https://github.com/helloflask/flask-tutorial
本书示例程序源码:https://github.com/helloflask/watchlist
学习 Flask 开发前,我假设你已经了解了 Python 和 HTML 的基础知识。如果还没有,那么可以先从下面这些在线资源入手:
《使用 HTML、CSS 和 Javascript 构建简单的网站》 - Microsoft Learn
《Web 入门教程》 - MDN
《使用 Python 迈出第一步》 - Microsoft Learn
《Python 教程》 - Python.org
《GIT简明指南》
Flask 对模板文件有默认的目录约定,建议按以下结构组织项目:
my_flask_app/
├── app.py # 主程序文件
└── templates/ # 存放 Jinja2 模板文件的目录(固定名称)
├── base.html # 基础模板(可选,用于继承)
└── index.html # 页面模板
注意:模板目录必须命名为 templates,且与主程序文件在同一级目录(或按 Flask 配置指定其他路径)。
一个入门的例子:app.py
from flask import Flask, url_for, request
from markupsafe import escape
# 从 flask 包导入 Flask 类,通过实例化这个类,创建一个程序对象 app
app = Flask(__name__)
#使用 app.route() 装饰器来为处理函数绑定对应的 URL,当用户在浏览器访问这个 URL 的时候,就会触发这个函数,获取返回值,
@app.route('/')
@app.route('/index')
@app.route('/home')
#一个视图函数也可以绑定多个 URL,这通过附加多个装饰器实现
#无论是访问 http://localhost:5000/、http://localhost:5000/home 还是 http://localhost:5000/index 都可以看到返回值。
#视图函数的名字是自由定义的,和 URL 规则无关。和定义其他函数或变量一样,只需要让它表达出所要处理页面的含义即可。
def index(): #注册一个处理函数,当用户访问根 URL 时,会调用这个函数,并返回一个响应
return '<h1>Hello Totoro!</h1><img src="http://helloflask.com/totoro.gif">'
@app.route('/hello')
def hello():
name = request.args.get('name', 'Flask') # 获取查询参数name的值
return '<h1>Hello, %s!</h1>' % name # 插入到返回值中
#可以在 URL 里定义变量部分。比如下面这个视图函数会处理所有类似 /user/<name>
@app.route('/user/<name>')
def user_page(name):
#通过下面的方式,我们也可以在视图函数里获取到这个变量值
return f'User: {escape(name)}'
@app.route('/test')
def test_url_for():
# 下面是一些调用示例(请访问 http://localhost:5000/test 后在命令行窗口查看输出的 URL):
print(url_for('hello')) # 生成 hello 视图函数对应的 URL,将会输出:/
# 注意下面两个调用是如何生成包含 URL 变量的 URL 的
#url_for函数是Flask提供的用来生成 URL的,它接受的第一个参数就是端点值,默认为视图函数的名称
print(url_for('user_page', name='greyli')) # 输出:/user/greyli
print(url_for('user_page', name='peter')) # 输出:/user/peter
print(url_for('test_url_for')) # 输出:/test
# 下面这个调用传入了多余的关键字参数,它们会被作为查询字符串附加到 URL 后面。
print(url_for('test_url_for', num=2)) # 输出:/test?num=2
return 'Test page'
然后在命令行app.py文件所在目录下,运行:flask run即可
浙公网安备 33010602011771号