Flask快速入门3
十一,Flask Cookies
Cookie以文本文件的形式存储在客户端的计算机上。其目的是记住和跟踪与客户使用相关的数据,以获得更好的访问者体验和网站统计信息。
Request对象包含Cookie的属性。它是所有cookie变量及其对应值的字典对象,客户端已传输。除此之外,cookie还存储其网站的到期时间,路径和域名。
在Flask中,对cookie的处理步骤为:
1. 设置cookie:
设置cookie,默认有效期是临时cookie,浏览器关闭就失效
可以通过 max_age 设置有效期, 单位是秒
resp = make_response("success") # 设置响应体
resp.set_cookie("username", "zhangsan", max_age=3600)
2. 获取cookie
获取cookie,通过request.cookies的方式, 返回的是一个字典,可以获取字典里的相应的值
cookie_1 = request.cookies.get("username")
3. 删除cookie
这里的删除只是让cookie过期,并不是直接删除cookie
删除cookie,通过delete_cookie()的方式, 里面是cookie的名字
resp = make_response("del success") # 设置响应体
resp.delete_cookie("username")
十二,Flask 会话
与Cookie不同,Session(会话)数据存储在服务器上。会话是客户端登录到服务器并注销服务器的时间间隔。
需要在该会话中保存的数据会存储在服务器上的临时目录中。
为每个客户端的会话分配会话ID。会话数据存储在cookie的顶部,服务器以加密方式对其进行签名。
对于此加密,Flask应用程序需要一个定义的SECRET_KEY。
Session对象也是一个字典对象,包含会话变量和关联值的键值对。
login.py:
from flask import render_template from flask import make_response from flask import Flask, session, redirect, url_for, request app = Flask(__name__) #加密方式对其进行签名 app.secret_key = 'fkdjsafjdkfdlkjfadskjfadskljdsfklj' @app.route('/') def index(): if 'username' in session: username = session['username'] return '登录用户名是:' + username + '<br>' + \ "<b><a href = '/logout'>点击这里注销</a></b>" return "您暂未登录, <br><a href = '/login'></b>" + \ "点击这里登录</b></a>" @app.route('/login', methods = ['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action = "" method = "post"> <p><input type="text" name="username"/></p> <p><input type="submit" value ="登录"/></p> </form> ''' @app.route('/logout') def logout(): # remove the username from the session if it is there session.pop('username', None) return redirect(url_for('index')) if __name__ == '__main__': app.run(debug = True)
十三,Flask 重定向和错误
Flask类有一个redirect()函数。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置。
redirect()函数的原型如下:Flask.redirect(location, statuscode, response)
location 参数是应该重定向响应的URL。
statuscode 发送到浏览器标头,默认为302。
response 参数用于实例化响应。
statuscode 状态代码已标准化:
HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT
默认状态代码为302,表示'found'。
Flask类具有带有错误代码的abort()函数。Flask.abort(code)
Code 参数采用以下值之一:
400 - 用于错误请求
401 - 用于未身份验证的
403 - Forbidden
404 - 未找到
406 - 表示不接受
415 - 用于不支持的媒体类型
429 - 请求过多
mysite.py:
@app.route('/') def index(): return render_template("login.html") @app.route('/success/<name>') def success(name): return 'welcome %s;logged in successfully' % name @app.route('/login',methods = ['POST', 'GET']) def login(): error = None if request.method == 'POST': #print('POST 方法') #post方法,通过表单 request.form['nm'] 取值 user = request.form['nm'] if user == 'admin': return redirect(url_for('success', name=user)) else: #401 - 用于未身份验证的 abort(401) else: #print('GET 方法') #get方法,通过参数 request.args.get('nm') 取值 user = request.args.get('nm') return redirect(url_for('success',name = user))
十四,Flask 消息闪现
Flask 模块包含 flash() 方法。它将消息传递给下一个请求,该请求通常是一个模板。
flash(message, category) ; 其中,
message 参数是要闪现的实际消息。
category 参数是可选的。它可以是“error”,“info”或“warning”。
为了从会话中删除消息,模板调用 get_flashed_messages()。
get_flashed_messages(with_categories, category_filter)
两个参数都是可选的。如果接收到的消息具有类别,则第一个参数是元组。第二个参数仅用于显示特定消息。
Flash.py:
from flask import Flask, flash, redirect, render_template, request, url_for, session app = Flask(__name__) # 登录用户方法,必须要有安全密钥值,不能登录跳转不了页面,可以自定义一个字符串 app.secret_key = 'fkdjsafjdkfdlkjfadskjfadskljdsfklj' @app.route('/') def index(): return render_template("login.html") @app.route('/home') def home(): # 验证session设置是否成功 username = session['username'] flash('登录成功。') # flash 对象实际存储到了session里面,可以存储多个flash值,多个为列表,格式如下: # <SecureCookieSession {'username': 'admin', '_flashes': [('message', 'You were successfully logged in'),('message', '登录成功。')]}> return render_template("home.html") @app.route('/login', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': user = request.form['nm'] if user != 'admin': error = 'Invalid username or password. Please try again!' else: session['username'] = request.form['nm'] flash('You were successfully logged in') # flash 对象实际存储到了session里面格式如下: # <SecureCookieSession {'username': 'admin', '_flashes': [('message', 'You were successfully logged in')]}> return redirect(url_for('home')) return render_template('login.html', error=error) if __name__ == '__main__': app.run(debug=True)
home.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>home</title> </head> <body> {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <p>{{ message }}</p> {% endfor %} {% endif %} {% endwith %} <h3>Welcome! {% if session['username'] %} <p>{{ session['username'] }}</p> {% endif %} </h3> <a href="{{ url_for('login') }}">login</a> </body> </html>
十五,Flask 文件上传
Flask 中处理文件上传非常简单。它需要一个 HTML 表单,其 enctype 属性设置为“multipart/form-data”,将文件发布到 URL。
URL 处理程序从 request.files[] 对象中提取文件,并将其保存到所需的位置。
每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。
目标文件的名称可以是硬编码的,也可以从 request.files[file] 对象的 filename 属性中获取。
但是,建议使用 secure_filename() 函数获取它的安全版本。
可以在 Flask 对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
app.config['UPLOAD_FOLDER'] 定义上传文件夹的路径
app.config['MAX_CONTENT_LENGTH'] 指定要上传的文件的最大大小(以字节为单位)
upload.html:
<html> <head> <title>File Upload</title> </head> <body> <form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="提交" /> </form> </body> </html>
upFile.py:
from flask import Flask, render_template, request, current_app from werkzeug.utils import secure_filename import os app = Flask(__name__) with app.app_context(): # within this block, current_app points to app. print ("app_context: "+str(current_app.name)) #定义上传文件夹的路径 app.config['UPLOAD_FOLDER'] = 'upload/' #指定要上传的文件的最大大小(以字节为单位) app.config['MAX_CONTENT_LENGTH'] = 1024 * 10 @app.route('/upload') def upload_file(): return render_template('upload.html') @app.route('/uploader', methods=['GET', 'POST']) def uploader(): if request.method == 'POST': #每个上传的文件首先会保存在服务器上的临时位置,然后将其实际保存到它的最终位置。 f = request.files['file'] print(f.filename) #保存文件到指定路径 #目标文件的名称可以是硬编码的,也可以从 request.files[file] 对象的 filename 属性中获取。 #但是,建议使用 secure_filename() 函数获取它的安全版本 f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename))) return 'file uploaded successfully' else: return render_template('upload.html') if __name__ == '__main__': app.run(debug=True)