一、请求(Request)
def requesttese():
1.请求方式
print(request.method)
2.请求路径
print(request.path)
3.请求参数(get) 类似于字典
print(request.args) 字典形式输出
print(request.args[‘参数名’]) 获取key对应的值
print(request.args.get(‘参数名’))
注意:推荐用get,因为[ ] 获取不到值会报错,get返回none,应该可根据none做判断
4.请求参数(post) 类似于字典,默认是接收post参数 还可以接收PUT,PATCH参数 print(request.form.get(‘key值’))
ImmutableMultiDict类型
ImmutableMultiDict类似字典的数据结构
与字典的区别,可以存在相同的键
args、form、files都是ImmutableMultiDict的对象
ImmutableMultiDict数据获取方式
dict['uname']
dict.get('uname') # 推荐(在没有数据为空)
dict.getlist('uname') # 获取指定key对应的所有值
5.url,完整请求地址
print(request.url)
6.无请求参数,去掉GET参数的URL
print(request.base_url)
7.请求的客户端地址
print(request.remot_addr)
8.上传文件
print(request.file)
9.请求头
print(request.headers)
10.请求中的cookie
print(request.cookies)
return ‘测试值’
request、session是内置对象(所有路由函数中都有)!
二、响应(Response)
0.直接return,为字符串
1.render_template(“模板”,可传参)
渲染模板,将模板转换成字符串
2.make_response(render_template())
创建一个响应
3.Response(render_template())
创建响应
####################例题####################
@blue.route(“/make/”)
def makeresponse():
response = render_response(“index.html")
return make_response(response)
#########################################
4.redirect(url_for(蓝图名.函数名))
重定向,一般与反向解析结合
5.abort状态码,抛出异常
eg:
@blue.route(‘/’)
def makeabort():
abort(404)
return '网页丢失,先看会猴子吧'
6.-异常捕获
- 可以根据状态或 Exception进行捕获
- 函数中要包含一个参数,参数用来接收异常信息
eg:
@blue.errorhandler(404)
def handler404(exception):
return '我是404,咋的了' # 也可以返回写好的404页面
三、session、cookie
- 客户端会话技术,浏览器的会话技术
- 数据全都是存储在客户端中
- 存储使用的键值对结构进行的存储(key-value)
- Cookie是通过服务器创建的Response来创建的
- cookie特性
支持过期时间
默认会自动携带本网站的所有cookie
根据域名进行cookie存储
不能跨域名
不能跨浏览器
# 首页@blue.route('/index/')
def index():
name = request.cookies.get('uname','访客')
return render_template('index.html',uname=name)
# 登录
@blue.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
# 获取用户名
name = request.form.get('username','访客')
# 设置cookie
response = redirect(url_for('twoday.index'))
response.set_cookie('uname',name)
return response
# 退出
@blue.route('/quit/')
def quit():
# 删除cookie
response = redirect(url_for('twoday.index'))
response.delete_cookie('uname')
return response
自己理解总结:当用户请求提交时,为此用户设置一个cookie令牌,以后访问时,就校对令牌,令牌存放于客户端,服务端并没有保存,应该不安全吧
- 服务端的会话技术
- 所有数据存储在服务器中
- 默认存储在内存中
django默认做了数据持久化(存在了数据库中)
- 存储结构也是key-value形式,键值对(其实就是字典)
- session 是离不开cookie的
pip install Flask-Session
pip install flask-redis
# 首页
@blue.route('/index/')
def index():
# 登录界面设置完session,此处获取,传值去首页此uname对应index.html中的变量
name = session.get('username','访客')
return render_template('index.html',uname=name)
# 登录
@blue.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
# 获取登录名
name = request.form.get('username')
# 设置session,此username与上面username无关系
session['username'] = name
return redirect(url_for('twoday.index'))
# 退出
@blue.route('/quit/')
def quit():
# 方式一(一般不建议使用,因为如果改session名的话,不好维护)
response = redirect(url_for('twoday.index'))
response.delete_cookie('session') 系统默认存在cookie中key是session
return response
# 方式二
session.pop(“username”)
return redirect(url_for("twoday.index"))
# __init__中设置session
def create_app():
app = Flask(__name__)
session存放于缓存redis中的配置
# 设置秘钥,此值任意编写,有就行
app.config['SECRET_KEY'] = 'dsfjj13413lkd0&sadas'
# 设置session类型
app.config['SESSION_TYPE'] = 'redis'
# 设置cookie中存储key
app.config['SESSION_COOKIE_NAME'] = 'yy'
# 设置超时时间
app.config['PERMANENT_SESSION_LIFETIME'] = 30
# 注册蓝图
app.register_blueprint(blueprint=blue)
# 初始化Session
Session(app)
return app
自己理解总结:当用户请求提交登录时,为此用户设置一个session属性,存放于服务器,服务器响应返回用户一个类似令牌的标识,此令牌存放于cookie中,以后访问时,需要校对cookie中的session标识,确定用户,此方法安全,不用担心客户端的cookie是否修改;因为存放于cookie中,因此删除cookie可删除标识,cookie的默认名是session,不推荐;还有一种删除是删除session属性,常用此种方法。