欢迎大家来到IT世界,在知识的湖畔探索吧!
1、使用Flask处理表单
1.1、使用Flask处理通用表单
from flask import Flask,render_template,request
app = Flask(__name__)
@app.route('/')
def hello_world():
return render_template('index.html') #使用render_template()函数渲染模板
@app.route('/login', method = ['GET','POST']) #定义路由,指定访问方法
def login():
if request.method == 'GET': #判断请求方法
return "这是get请求"
else:
return "这是post请求"
if __name__ == '__main__':
app.run(debug = True)
欢迎大家来到IT世界,在知识的湖畔探索吧!
1.2、使用Flask-WTF处理表单
1、Flask-WTF安装
pip install flask-wtf ;
2、启用CSRF保护
Flask-WTF提供了对所有From表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击的技术支持。 要想启用CSRF保护,可以在Flask根目录下新增的config.py中定义两个变量: CSRF_ENABLED = True
SECRET_KEY = ‘x1xx3x3x4x5’ (尽可能复杂)
3、WTF表单登录实例
欢迎大家来到IT世界,在知识的湖畔探索吧!### config.py
import os
SECRET_KEY = os.urandom(24) # 生成SECRET_KEY(密钥)
CSRF_ENABLED = True
### form.py
from flask_wtf import Form # 引入Form基类
from wtforms import StringField,PasswordField # 引入Form元素父类
from wtforms.validators import DataRequired,Length # 引用Form验证父类
class BaseLogin(Form):
# 用户名
name = StringField('name',validators = [DataRequired(message = "用户名不能为空"), Length(6,16,message = "长度位于6-16之间")], render_kw = {'placehoider' :'请输入用户名'})
# 密码
password = PasswordField('password', validators = [DataRequired(message = "密码不能为空"), Length(6,16,message = "长度位于6-16之间")],render_kw = {'placeholder':'请输入密码'})
欢迎大家来到IT世界,在知识的湖畔探索吧!### app.py
from flask import Flask,flash
from flask import url_for,render_template
from forms import BaseLogin
import config
app = Flask(__name__)
app.config.from_object(object)
@app.route('/login',method = ['GET','POST'])
def baselogin(): # 定义视图函数
form = BaseLogin() # 进行表单验证
# 判断验证提交是否通过
if form.validate_on_submit():
flash(form.name.data+'|'+form.password.data) # flash进行消息闪现
return '表单数据提交成功' # 返回数据
else:
# 渲染
return render_template('login.html',form = form) # 渲染模板
@app.route('/')
def hello_world():
return "hello world"
if __name__ == '__main__':
app.run(debug=True)
2、使用Flask上传文件
2.1、简单实现
Flask文件上传需要注意以下3点要求:
1、一个< form >标签被标记有 enctype = multipart/form-data , 并且在里面包含一个< input type=file> 标签; (例如:< form action=”” method=”post” enctype=”multipart/form-data”> )
2、服务端应用通过请求对象上的files字典访问文件;
3、使用文件的save()方法将文件永久地保存在文件系统上的某处。
### app.py
from flask import Flask,render_template,request
import os
from os import path
# 导入secure_filename模块,将文件名中所有的中文名过滤掉,只剩下文件后缀名
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/',method = ['GET','POST'])
def hello_world():
if request.method == 'GET':
return render_template('upload.html')
else:
f = request.file['file'] # 获取文件流
filename = secure_filename(f.filename) # 去掉中文命名
f.save(path.join('static/uploads',filename)) # 使用.save()方法保存文件
return "文件上传成功" ##返回数据
if __name__ == '__main__':
app.run(debug=True)
2.2、改进上传功能
存在的问题:
1、文件没有进行重命名,多个用户可能会存在上传同名文件的问题;
2、没有实现文件目录的自动创建,如果网站部署时忘记创建文件保存目录,则会出现文件保存失败问题,影响用户体验;
3、文件上传时,没有进行必要的文件格式检验,用户可以直接将可执行文件上传到服务器上,影响到服务器的数据安全性。
### app.py
from flask import Flask,render_template,request,send_from_directory
import time
import os
from os import path
from werkzeug.utils import secure_filename
import platform
app = Flask(__name__)
# 根据系统操作系统调整路径格式
if platform.system() == "Windows":
slash = '\\'
elif platform.system() == "Linux":
slash = '/'
UPLOAD_PATH = os.path.curdir + slash + 'uploads' + slash
@app.route('/',method = ['GET','POST'])
def hello_world():
if request.method == 'GET':
return render_template('upload.html')
else:
if not os.path.exists(UPLOAD_PATH): # 判断文件保存路径是否存在
os.makedirs(UPLOAD_PATH) # 没有目录则创建目录
# 表单验证
form = UploadForm(CombinedMultiDict([request.form,request.files]))
if form.validate():
f = reuqest.files['file'] # 获取文件流
filename = secure_filename(f.filename) # 获取文件名称
ext = filename.rsplit('.',1)[1] # 获取文件后缀
unix_time = int(time.time()) # 获取时间
new_filename = str(unix_time) + '.' + ext # 对文件重命名
file_url = UPLOAD_PATH + new_filename
f.save(path.join(UPLOAD_PATH, new_filename)) # 保存文件
return "上传文件成功"
else:
return "只支持jpg、png以及gif格式的文件"
# 访问上传文件 https//127.0.0.1:5000/images/xxx.jpg/
@app.route('/images/<filename>/',method=['GET','POST'])
def get_image(filename): # 视图函数,访问图片
# 得到绝对路径
dirpath = os.path.join(app.root_path,'uploads')
# return send_from_directory(dirpath,filename,as_attachment=True) #下载方式
return send_from_directory(dirpath,filename) # 在线浏览方式
if __name__ == '__main__':
app.run(debug=True)
### form.py
from wtforms import Form,FileField,StringField
from wtforms.validators import InputRequired
from flask_wtf.file import FileRequired,FileAllowed
class UploadForm(Form):
# FileRequied验证是否为空;FileAllowed:指定文件支持的格式
file = FileField(validators=[FileRequired(), FileAllowed(['jpg','png','git']) )
3、Cookie的使用
3.1、Cookie的基本概念
Cookie是一种能够让网站服务器把少量数据存储到客户端的硬盘或者内存,或者是从客户端的硬盘读取数据的一种技术。当用户访问服务器并登录成功后,服务器向客户端返回一些数据(Cookie),客户端将服务器返回的Cookie数据保存在本地,当用户再次访问服务器时,浏览器自动携带Cookie数据给服务器,服务器就知道访问者的身份信息。
Cookie的基本语法: set_cookie(name,value,expire,path,domain,secure)
name : 必需项,规定Cookie的名称
value:必需项,规定Cookie的值
expire: 可选项,规定Cookie的有效期
path: 可选项,规定Cookie在当前web下哪些目录有效
domain:可选项,规定Cookie作用的有效域名
secure:可选项,规定是否通过安全的HTTPS链接来传输Cookie
3.2、Cookie的基本使用
1、设置Cookie 设置Cookie有两种方法,一种时通过Response对象来设置,另一种时通过直接设置表单头来实现。
### 通过Response对象来设置Cookie
from flask import Flask,request,Response
app = Flask(__name__)
@app.route('/')
def set_cookie():
# 创建响应对象
resp = Response("进行Cookie设置!")
# 设置cookie名为username,cookie名称为bing,默认关闭浏览器失效
resp.set_cookie("username","bing") # 存入cookie
return resp
if __name__ == '__main__':
app.run(debug=True)
### 通过设置表单头来设置Cookie
from flask import Flask,request,Response
app = Flask(__name__)
@app.route('/')
def set_cookie():
# 创建响应对象
resp = Response("进行Cookie设置!")
# 设置cookie名为username,cookie名称为bing,默认关闭浏览器失效
resp.headers["Set_Cookie"] = "username=bing; Expires=SUN,01-Dec-2020 20:20:02 GMT; Max-Age=3600; path=/")
return resp
if __name__ == '__main__':
app.run(debug=True)
2、查看cookie
@app.route('/get_cookie')
def get_cookie():
username = request.cookies.get('username')
return username
3、删除cookie
@app.route('/del_cookie')
def del_cookie():
resp = Response("删除cookie")
resp.delete_cookie("username")
return resp
4、cookie基本操作综合实例
from flask import Flask,request,Response
app = Flask(__name__)
@app.route('/')
def set_cookie(): # 设置cookie
# 创建响应对象
resp = Response("进行Cookie设置!")
# 设置cookie名为username,cookie名称为bing,保持1个小时失效,默认关闭浏览器失效
resp.set_cookie("username","bing", max_age = 3600) # 存入cookie
return resp
@app.route('/get_cookie')
def get_cookie(): # 获取cookie
username = request.cookies.get('username')
return username or "没有获取到username"
@app.route('/del_cookie')
def del_cookie(): # 删除cookie
resp = Response("删除cookie")
resp.delete_cookie("username")
return resp
if __name__ == '__main__':
app.run(debug=True)
4、Session的使用
4.1、session的基本使用
1、设置Session
通过session[‘name’]=’value’的方法来设置的,name代表变量名称,value代表变量值。
### 设置session
from flask import Flask,session
import os
app.config['SECRET_KEY'] = os.urandom(24) # 生成密钥
@app.route('/')
def set_session():
session['username'] = 'bing'
return "设置session成功!"
if __name__ == '__main__':
app.run(debug=True)
2、获取session值 获取session有两种方法,推荐第二种
(1)result = session[‘username’] : 如果内容不存在,会出现异常
(2)result = session.get(‘username’) : 如果内容不存在,返回None
@app.route('/get_session')
def get_session():
username = session.get('username')
return username or 'session 为空'
3、删除session值或者清除session所有的值
删除单个session值可以用Session.pop(‘key’), 清除多个session的值用Session.clear方法。
@app.route('/del_session')
def del_session():
session.pop('username')
# session.clear # 清空session
return "Session 被删除"
4、设置Session的过期时间
如果没有指定session的过期时间,默认浏览器关闭后自动结束。 通过 session.permanent = True 可以将过期时间延长至一个月。 还可以设置具体的天数,代码见下:
from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(day=7) # 配置7天有效
@app.route('/')
def set_session():
session['username'] = 'bing'
session.permanent = True
return "session设置成功"
5、钩子函数的使用
有时候需要在代码执行的前、中、后时期,强行执行一段我们想要执行的功能代码,实现这种功能的函数,就称为钩子函数。
1、before_first_request() 函数 在第一次请求之前可以执行的函数,只会执行一次。
2、before_request() 函数 每一次请求之前可以执行某个特定功能的函数。一般可以用来检测用户的请求是否合法、权限检查等场景。
3、after_request() 函数 每一次请求之后可以执行的某个特定功能的函数。一般可以用来产生csrf_token验证码等场景。该函数必需给出响应对象(response)。
4、teardown_request() 函数 每一次请求之后都会调用,会接受一个参数,参数时服务器出现错误的信息。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17994.html