Flask
Flask
安装flask
使用py3创建虚拟环境,创建后项目目录下会有一个venv目录
mkdir myproject
cd myproject
python3 -m venv venv
激活虚拟环境
. venv/bin/activate
安装Flask
pip install Flask
hello world
先写一个hello world
#导入flask
from flask import Flask
app = Flask(__name__)
#一个route(跟Java的controller相似)
@app.route('/')
def hello_world():
return 'Hello, World!'
Flask 路由
route()
在flask中路由的绑定使用的是装饰器route()
@app.route('/')
def index():
return 'Index Page'
@app.route('/login')
def login():
return 'login'
url变量转换器
flask的路由支持以下方式获取url变量,当不指定其转换器时,默认是str
#匹配url变量,restful风格
@app.route('/user/<username>')
def show_user_profile(username):
print("username=",username)
return username
#使用一个int类型的转换器,将url参数转换int
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
flask支持以下url转换器
string | (缺省值) 接受任何不包含斜杠的文本 |
---|---|
int | 接受正整数 |
float | 接受正浮点数 |
path | 类似 string ,但可以包含斜杠 |
uuid | 接受 UUID 字符串 |
Http请求接收方式
使用methods可以指定允许接收的http的请求方式,默认是get
from flask import request
#使用methods指定接收哪些HTTP请求
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return "接收post请求"
else:
return "接收get请求"
url_for
使用url_for()函数可以通过函数名反向获取其绑定的url路径
#以下内容来自官方案例
from flask import Flask, url_for
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return '{}\'s profile'.format(escape(username))
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', next='/'))
print(url_for('profile', username='John Doe'))
#结果
#/
#/login
#/login?next=/
#/user/John%20Doe
模板引擎
render_template
flask自动帮你配置Jinja2模板引擎,可以使你的route映射到前端模板,做到视图绑定的作用。
在下面的例子中,但你请求/hello/Tom时,flask将会把你跳转到hello.html页面中,并将要渲染的信息通过参数传递过去,这样你就可以将传递的信息渲染到hello.html页面上。
render_template自动转义默认开启。因此,如果 name
包含 HTML ,那么会被自动转义。
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
#请求将和hello.html视图进行绑定,并可以携带参数
return render_template('hello.html', name=name)
视图寻找路径
Flask 会在 templates
文件夹内寻找模板,并支持以下两种路径结构:
#更app在同级目录下
/application.py
/templates
/hello.html
#在application目录下面
/application
/__init__.py
/templates
/hello.html
request
在flask中使用request最为请求对象,通过request对象,我们获取用户请求中的参数和数据。
某些对象在 Flask 中是全局对象,但不是通常意义下的全局对象。这些对象实际上是 特定环境下本地对象的代理。
#一个全局的请求代理
from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
#请求代理,会根据其线程号去动态获取真实的request
#所以这里使用全局request将会指向的当前线程的local(本地环境)中的request对象
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template('login.html', error=error)
文件上传
在flask中,可以直接通过以下方式获得文件
from flask import request
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['POST'])
def upload_file():
f = request.files['the_file']
f.save('/var/uploads/uploaded_file.txt')
#以用户上传的名字设置名字
#f.save('/var/uploads/' + secure_filename(f.filename))
Cookies
用户请求中的cookies,可以通过request.cookies直接获取
@app.route('/')
def index():
username = request.cookies.get('username')
而如果你想在响应中设置cookies,可以通过以下方法
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
redirect
上面说了我们可以通过render_template()跟一个视图进行绑定,现在就讲一下重定向,在flask中重定向使用redirect函数进行操作,使用十分简单。
from flask import abort, redirect, url_for
@app.route('/')
def index():
#先通过url_for获取login函数绑定的url路径,再通过redirect重定向到该url上
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(401)
this_is_never_executed()
重定向到flask定制的错误页
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
make_response
在flask中使用make_response来定制自己的响应
from flask import render_template, url_for,make_response
@app.errorhandler(404)
def not_found(error):
resp = make_response(render_template('error.html'), 404)
#设置响应头
resp.headers['X-Something'] = 'A value'
return resp
JSON格式的响应
flask支持将一个python dict转换为json字符串并作为响应返回到前端。
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}
session
flask中session对象来代表会话,当然这个session和request一样也是一个代理对象,实际的session对象会去本地环境中获取。
#下面官方案例
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
#对session id进行加盐
app.secret_key = b'_5#y2asdfas4Q8z\n\xec]/'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)