【Flask】大型项目中对于url_for() 的使用以及请求数据上传文件的开发实例
url_for() 的使用
url_For()是flask框架提供的函数。第一个参数可以作为表示路线的端点传入。它主要用于生成URL,避免开发人员手写URL。 使用url_ for()生成的url是相对路径。一些开发人员更喜欢用绝对路径定义文件路径。(这是非常不友好和不灵活的!) 所以也许你仍然认为它是抽象的。让我们用一个小演示来演示:
@app.route('/user/<username>')
def user_info(username):
return f'地址上传入的用户名称: {username} !~'
请求数据上传文件
from flask import request
with app.test_request_context('/hello', method='POST'):
# now you can do something with the request until the
# end of the with block, such as basic assertions:
assert request.path == '/hello'
assert request.method == 'POST'
用Flask上传文件很容易。确保不要忘记在HTML表单中设置enctype=“multipart/form-data”属性。 否则,浏览器将不会传输文件。 上传的文件存储在内存或文件系统中的临时位置。 可以通过请求对象的files属性来访问上载的文件。每个上载的文件都存储在此字典属性中。该属性基本上与标准Python文件对象相同。 此外,还添加了一个save()方法来将上传的文件保存到服务器的文件系统中 它的工作原理:
with app.request_context(environ):
assert request.method == 'POST'
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
...
如果要在上载文件之前知道客户端系统中文件的名称,可以使用filename属性。
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['the_file']
file.save(f"/var/www/uploads/{secure_filename(file.filename)}")
...
但请记住,这种价值观是可以伪造的,千万不要相信它。如果要使用客户端文件名作为服务器文件名,可以使用Werkzeug_Filename()函数提供的安全性。
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# use cookies.get(key) instead of cookies[key] to not get a
# KeyError if the cookie is missing.
要访问cookie,可以使用cookie属性。 可以使用响应对象_ Cookie方法的集合来设置Cookie。 请求对象的cookie属性是包含客户端传输的所有cookie的字典。 在Flask,如果使用会话,则不应直接使用cookie,因为会话更安全。
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
cookie设置在响应对象上。 通常,只从视图函数返回字符串,Flask会将它们转换为响应对象。如果要显式转换,可以使用make_response()函数,然后对其进行修改。
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(401)
this_is_never_executed()
会话
除了请求对象之外,还有一个名为session的对象, 它允许在不同请求之间存储信息。此对象相当于用密钥签名加密的cookie。也就是说,用户可以查看的cookie,但如果没有密钥,则无法修改它。 在使用会话之前必须设置密钥。
from flask import session
# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/')
def index():
if 'username' in session:
return f'Logged in as {session["username"]}'
return 'You are not logged in'
@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>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))
app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')
相关文章
- [Nat.Mach.Intell.|论文简读]scBERT 用于单细胞RNA-seq数据的细胞类型标注的大规模预训练深度语言模型
- [CVPR | 论文简读] Uformer:一种用于图像恢复的通用u形Transformer
- [CVPR | 论文简读] 基于信息分流的多尺度自注意力机制
- [PNAS | 论文简读] 社会化人工智能能够从人类互动中学习
- Genome Biology | iDNA-ABF: 基于多尺度深度学习的生物序列与功能语义模型实现DNA甲基化可解释性预测
- Apache Airflow:安装指南和基本命令
- 重磅!百余名生物信息领域中国学者入围全球前2%顶尖科学家榜单
- Apache Airflow-编写第一个DAG
- [Bioinformatics | 论文解读] 基于生成对抗网络的单细胞半监督注释和降维框架
- [AAAI | 论文解读] 知识图谱如何嵌入对未知数据的外推:语义证据视图
- Rolling Deployments 滚动部署
- [IJCAI | 论文解读] AttExplainer:通过强化学习的注意力机制来解释 Transformer
- [Brief. Bioinformatics | 论文简读] 一种从生物序列中提取特征的工具
- [KDD 2022 | 论文简读] 避免由于节点嵌入中的相似性假设而导致的偏差
- [JCIM 2022 | 论文简读] 多任务深度神经网络在Ames致突变性预测中的应用
- VScode本地进行Jenkinsfile语法验证
- Apache Airflow-ETL 工作流的下一级CRON替代方案
- Protein science︱王舒禹团队:贝叶斯与图神经网络结合预测突变对蛋白质稳定性的影响
- 软件测试|测试方法论—边界值
- [AAAI 2022 | 论文简读] SpreadGNN: 分子数据上图神经网络的分散式多任务联邦学习