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

url_for() 的使用

url_For()是flask框架提供的函数。第一个参数可以作为表示路线的端点传入。它主要用于生成URL,避免开发人员手写URL。
使用url_ for()生成的url是相对路径。一些开发人员更喜欢用绝对路径定义文件路径。(这是非常不友好和不灵活的!)
所以也许你仍然认为它是抽象的。让我们用一个小演示来演示:

@app.route('/user/')
def user_info(username):
    return f'地址上传入的用户名称: {username} !~'

请求数据上传文件

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

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

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

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

你可能感兴趣的:(开发大纲,flask,python,后端)