【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')
- 点赞
- 收藏
- 关注作者
评论(0)