flask 初体验
准备工作
创建虚拟环境
mkdir myproject
cd myproject
python3 -m venv venv
激活虚拟环境
. venv/bin/activate
安装Flask
pip3 install Flask
一个最简单的应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return '<p>Hello World!</p>'
if __name__ == '__main__':
'''
:param host: 指定监听主机,默认为127.0.0.1(localhost), 设置0.0.0.0 运行任何网络访问
:param port: 指定暴露端口,默认使用端口5000
:param debug: 默认为false。 如果设置为true,则提供调试信息
:param options: 要转发到底层的Werkzeug服务器。
'''
app.run(debug=True)
路由
现代 web 应用都使用有意义的 URL ,这样有助于用户记忆,网页会更得到用户的青睐, 提高回头率。
使用 route() 装饰器来把函数绑定到 URL:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
变量规则
Flask 变量规则
通过把 URL 的一部分标记为 <variable_name> 就可以在 URL 中添加变量。
标记的 部分会作为关键字参数传递给函数。
通过使用 converter:variable_name ,可以 选择性的加上一个转换器,为变量指定规则
from markupsafe import escape
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return f'Subpath {escape(subpath)}'
转换器类型
类型 | 描述 |
---|---|
string | (缺省值) 接受任何不包含斜杠的文本 |
int | 接受正整数 |
float | 接受正浮点数 |
path | 类似 string,但可以包含斜杠 |
uuid | 接受 UUID 字符串 |
HTML转义
当返回 HTML ( Flask 中的默认响应类型)时,为了防止注入攻击,所有用户提 供的值在输出渲染前必须被转义。使用 Jinja渲染的 HTML 模板会自动执行此操作。
手动转义
from markupsafe import escape
from flask import Flask
app = Flask(__name__)
@app.route("/<name>")
def hello(name):
return f"Hello, {escape(name)}!"
Flask URL构建
url_for()函数对于动态构建特定函数的URL非常有用。
url_for()函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分
from flask import Flask, redirect, url_for
app = Flask(__name__)
# 使用redirect 和url_for 进行跳转
@app.route('/admin')
def hello_admin():
return 'Hello admin'
@app.route('/guset/<guset>')
def hello_guset(guset):
return f'Hello {guset} as Guset'
@app.route('/user/<name>')
def show_name(name):
if name == 'admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guset', guset=name))
if __name__ == '__main__':
app.run(debug=True)
show_name 函数检查接收参数是否与 'admin’相匹配,如果匹配使用 url_for()将应用重定向到 hello_admin() 去,否则件参数作为 guset 传递给 hello_guset()函数。
FLASK HTTP方法
- Http协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。
方法 描述 GET 以未加密的形式将数据发送到服务器。最常见的方法。 HEAD 和GET方法相同,但没有响应体。 POST 用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。 PUT 用上传的内容替换目标资源的所有当前表示。 DELETE 删除由URL给出的目标资源的所有当前表示。 当了路径下创建一个login.html
<html> <head> <meta charset="utf-8"/> <title>Flask HTTP请求方法处理</title> </head> <body> <form action = "http://localhost:5000/login" method = "post"> <p>输入姓名:</p> <p><input type = "text" name = "name" value=""/></p> <p><input type = "submit" value = "提交" /></p> </form> </body> </html>
python 输入以下脚本
from flask import Flask, redirect, url_for, request app = Flask(__name__) @app.route('/success/<name>') def success(name): return 'welcome %s' % name @app.route('/login', methods=['POST', 'GET']) def login(): if request.method == 'POST': user = request.form['name'] return redirect(url_for('success', name=user)) else: user = request.args.get('name') return redirect(url_for('success', name=user)) if __name__ == '__main__': app.run(debug=True)
启动flask服务,将login.html 拖拽到浏览器中打开,输入并提交,你会看到你调到flask success() 函数中
以上是使用Flask的简单记录