第1关:请求对象
知识点
1.请求类型
(1)GET 请求:访问时会在地址栏直接显示,参数不安全,且参数大小比较小;
(2)POST 请求:参数不显示在地址栏,一般用户注册、登录都通过 POST 请求完成。
2.获取GET请求参数:
print(request.args) # 获取GET请求通过url传过来的值
print(request.args.get("name")) # 通过 get 获取 name
print(request.args["name"]) # 通过索引获取 name
print(request.args.to_dict()) # 将传入的GET参数获取到一个字典
3.获取POST请求参数:
print(request.form) # 获取以 POST 方式提交的数据
print(request.form.get('name')) # 获取 POST 请求参数
print(request.form.getlist('hobby')) # 获取一键多值类型的参数
print(request.form.to_dict()) # 将传入的POST参数获取到一个字典
编程要求
要求根据请求方式处理不同操作。具体要求如下:
- 如果请求为 GET 请求,则返回该原始页面;
- 如果请求为 POST 请求,则获取该请求参数。以指定格式返回;
- 具体要求请参见后续测试样例。
- 注意本关卡预置的返回模板为
register.html
from flask import Flask, request, render_template
app = Flask(__name__,static_url_path="/templates",static_path="/static")
app.config['DEBUG'] = True
@app.route('/register', methods=['GET', 'POST'])
def register(): # 视图函数
# 请在此处填写代码,并根据左侧编程要求完成代码的编写
# ********** Begin *********#
if request.method=='GET':
return render_template('register.html')
if request.method=='POST':
return "姓名:%s 年龄:%s 爱好:%s"%(request.form.get('name'),request.form.get('age'),request.form.getlist('hobby'))
# ********** End *********#
第2关:文件上传
知识点
1.前端form表单中enctype属性可用来控制表单数据在发送之前是如何进行编码的:
(1)multipart/form-data
:不对字符编码,用于发送二进制文件;
(2)text/plain
:用于发送纯文本内容,空格转换为 "+" 加号,不对特殊字符进行编码;
(3)application/x-www-form-urlencoded
:在发送前会编码所有字符,即在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,"+" 加号转换为空格,特殊符号转换为ASCII HEX
值)。
编程要求
要求实现文件上传操作的功能。具体要求如下:
- 如果请求为 GET 请求,则返回该原始页面;
- 如果请求为 POST 请求,则获取上传的文件;
- 如果检查到文件部件不存在或文件名为空(用户不选择文件,浏览器也提交),则返回该原始页面;
- 判断上传的文件格式是否为指定的格式(允许上传的文件后缀),同时确定文件名是否安全;
- 将上传的文件保存至
media
文件夹中; - 文件保存成功后,则返回**文件上传成功!,否则,返回文件上传失败!**;
- 具体要求请参见后续测试样例。
- 注意本关卡预置的返回模板是
upload.html
from flask import Flask, request, render_template, redirect
from werkzeug.utils import secure_filename
import os
app = Flask(__name__,static_url_path="/templates",static_path="/static")
# 保存后的文件路径(当前路径下)
UPLOAD_FOLDER = 'media'
# 允许存在的文件后缀
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif',"csv"])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
# 请在此处填写代码
# ********** Begin *********#
return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# ********** End **********#
@app.route("/upload", methods=['GET', 'POST'])
def upload():
# 请根据左侧编程要求实现相关代码实现
# ********** Begin *********#
# 如果请求为GET请求,则返回该原始页面
if request.method=='GET':
return render_template('upload.html')
# 如果请求为POST请求,则获取上传的文件;
# 检查到文件部件不存在或文件名为空(用户不选择文件,浏览器也提交),则返回该原始页面
else:
if "file" not in request.files:
return render_template('upload.html')
#return redirect(request.url)
file = request.files.get('file')
if file.filename == '':
return render_template('upload.html')
#return redirect(request.url)
# 判断上传的文件格式是否为指定的格式
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
# 将上传的文件保存至media文件夹中
file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
return "文件上传成功!"
else:
return "文件上传失败!"
# ********** End **********#
第3关:Cookies应用
编程要求
要求实现在 Flask 中操作 Cookie 的功能。具体要求如下:
- 补全
set_cookie()
函数,实现浏览器请求服务器写入 Cookie ;(通过浏览器存储到本地) - 补全
get_cookie()
函数,实现浏览器请求服务器查询存储在 Cookie 中的值; - 补全
del_cookie()
函数,实现浏览器请求服务器删除 Cookie 中的值
from flask import Flask,Response, request
app = Flask(__name__)
@app.route("/set_cookie")
def set_cookie():
reps = Response("写入cookie成功!!!")
# 请在此处填写代码,实现浏览器请求服务器写入cookie
# cookie存储的信息为: key:username value:zhangsan
#********** Begin *********#
reps.set_cookie('username','zhangsan')
#********** End *********#
return reps
@app.route("/del_cookie")
def del_cookie():
reps = Response("删除cookie成功!!!")
# 请在此处填写代码,实现浏览器请求服务器删除cookie中的值
#********** Begin *********#
reps.delete_cookie('username')
#********** End *********#
return reps
@app.route("/get_cookie")
def get_cookie():
# 请在此处编写代码,实现查询存储在cookie中的值
#********** Begin *********#
username=request.cookies.get('username')
#********** End *********#
if username:
return "获取到的Cookie值为:"+username
else:
return u"没有获取到Cookie"
第4关:Session应用
编程要求
要求使用 Flask 操作 Session 并实现相关功能。具体要求如下:
- 在
config.py
中配置使用一组 24 位的随机数对 Session 进行加密,并设置 Session 过期时间为 2 天; - 补全
set_session()
函数,实现用户请求服务器设置 Session ; - 补全
get_session()
函数,实现用户请求服务器获取 Session ; - 补全
del_session()
函数,实现用户请求服务器删除 Session ;
from flask import Flask, session
import os
from datetime import timedelta
app = Flask(__name__)
# 请在此处填写代码,并根据左侧编程要求完成代码的编写
# ********** Begin *********#
# 使用一组随机数对session进行加密
app.config['SECRET_KEY'] = os.urandom(24)
# 修改session 过期时间
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
# ********** End *********#
# 用户请求设置session
@app.route('/set_session')
def set_session():
# 请在此处填写代码,实现用户请求服务器设置session
# session存储的信息为: key:username value:hinzer
#********** Begin *********#
session['username'] = 'hinzer'
# 设置持久化
session.permanent = True
#********** End *********#
return '设置Session成功!'
# 用户请求清除session
@app.route('/del_session')
def del_session():
try:
# 请在此处填写代码,实现用户请求服务器删除session
#********** Begin *********#
session.pop("username")
#********** End *********#
except Exception:
return "Session不存在!"
return '清除Session成功!'
# 用户请求查询session
@app.route('/get_session')
def get_session():
# 请在此处填写代码,实现用户请求服务器获取session
# ********** Begin *********#
username = session.get('username')
# ********** End *********#
return "获取到的Session值为:"+username or '没有Session值'