【Flask】大型项目中对于url_for() 的使用以及请求数据上传文件的开发实例

举报
江南清风起 发表于 2024/08/14 21:57:06 2024/08/14
【摘要】 url_for() 的使用url_For()是flask框架提供的函数。第一个参数可以作为表示路线的端点传入。它主要用于生成URL,避免开发人员手写URL。使用url_ for()生成的url是相对路径。一些开发人员更喜欢用绝对路径定义文件路径。(这是非常不友好和不灵活的!)所以也许你仍然认为它是抽象的。让我们用一个小演示来演示:@app.route('/user/<username>')...

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')

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。