十一,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)

Flask快速入门3的更多相关文章

  1. Flask快速入门

    flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ...

  2. 【转】Flask快速入门

    迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from ...

  3. 【先验知识归纳】Flask快速入门

    本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...

  4. Flask快速入门day 01(flask介绍、快速使用、配置文件、路由系统)

    目录 Flask框架 前言: 一.flask介绍 1.介绍 2.使用两种协议编写web 二.flask快速使用 1.快速使用: 2.使用flask编写登录小案例 2.1 login.html 2.2 ...

  5. Flask快速入门,知识整理

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  6. Flask官方文档学习-flask快速入门

    环境搭建 下载安装Python3:www.python.org 终端运行命令:python3 -m venv flask_dev,来创建虚拟环境 启用虚拟环境,终端使用命令 source /flask ...

  7. Flask 快速入门

    最简单的flask程序 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return ...

  8. 二 Flask快速入门

    1: 外部可访问的服务器: 如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问.在调试模式下,用户可以在你的计算机上执行任意 Python 代码.因此,这个行 ...

  9. flask 快速入门链接

    http://docs.jinkan.org/docs/flask/quickstart.html

  10. Flask快速入门day02(1、CBV使用及源码分析,2、模板用法,3、请求与响应的基本用法,4、session的使用及源码分析,5、闪现,6、请求扩展)

    目录 Flask框架 一.CBV分析 1.CBV编写视图类方法 二.CBV源码分析 1.CBV源码问题 2.补充问题 3.总结 三.模板 1.py文件 2.html页面 四.请求与响应 1.reque ...

随机推荐

  1. Qt开源作品33-图片开关控件

    一.前言 进入智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在WINFORM项目上,如 ...

  2. [转]idea中创建maven的Javaweb工程并进行配置(图文教程)

    原文链接: idea中创建maven的Javaweb工程并进行配置(图文教程)

  3. 前端学习openLayers配合vue3(加载线上数据源)

    现在我们学习一下加载网上的线上数据再加上点矢量图层,紧接着上一步 关键代码 layers: [ //瓦片图层source第三方,或者自带的,地图的底层 new TileLayer({ // sourc ...

  4. SpringCloud(1)---入门篇

    SpringCloud理解篇 一.微服务概述 1.什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一 ...

  5. Linux 虚拟机中不重启的情况下加新硬盘及扩展根分区容量

    我这个系统是Redhat7.7的系统.磁盘占用比较高,需要扩充空用空间,同时又不能关停服务器,或者服务.所以就需要在虚拟机中不重启的情况下加新硬盘及扩展根分区容量. 首先,看一下我这个虚拟机分区占用情 ...

  6. DataGrip中执行ORACL语句块进行代码测试

    --语句块执行使用关键字declare声明变量,变量间分号隔开,SELECT INTO语句给变量赋值,语句块放到BEGIN END之间. declare v_id int; v_val varchar ...

  7. WAIC 2024盛大召开,天翼云以全栈智算能力赋能AI时代!

    7月5日,2024世界人工智能大会期间,中国电信星辰人工智能生态论坛在上海世博中心启幕.论坛以"星辰注智,焕新领航"为主题,围绕人工智能技术发展趋势,分享中国电信与产业各界在人工智 ...

  8. 蝉联第一,天翼云电脑持续领跑中国DaaS市场!

    近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...

  9. Luogu P9646 SNCPC2019 Paper-cutting 题解 [ 紫 ] [ manacher ] [ 贪心 ] [ 哈希 ] [ BFS ]

    Paper-cutting:思维很好,但代码很构式的 manacher 题. 蒟蒻 2025 年切的第一道题,是个紫,并且基本独立想出的,特此纪念. 判断能否折叠 我们先考虑一部分能折叠需要满足什么条 ...

  10. 从零开始的函数式编程(2) —— Church Boolean 编码

    [!quote] 关于λ表达式-- 详见λ表达式 本文导出自Obsidian,可能存在格式偏差(例如链接.Callout等) 本文地址:https://www.cnblogs.com/oberon-z ...