flask_三、重定向、session、cookie简单说明

上节遗留问题:

 

视图函数可以返回最多由三个元素组成的元祖:响应主体、状态码、首部字段。其中首部字段可以为字典,或是两元素元祖组成的列表,如:
return '', 302, {'Location': 'http://127.0.0.1:5000/redirect'}
return '', 302, [('lcoation', 'http://localhost:5000/A'), ('contentType', 'application/json')] 

 

app.py实例如下:

from flask import Flask
from flask import make_response

app=Flask(__name__)

@app.route('/hello/', endpoint = 'greeting')
def hello():
    d=('1','2',{'server':'gloryroad'})  # 传参需要注意的地方
    d1 = ('about page', 200, {'server':'heboan'})
    #response = make_response('about page', 200, {'server':'heboan'})
    #response = make_response('about page', 200, [('server','gloryroad'),('username','sam')])
    response = make_response(d)
    #response = make_response(d1)

    return response

运行结果:

 

 重定向、session、cookie简单说明

一、重定向

1.1第一种方式

from flask import Flask

app=Flask(__name__)

@app.route('/redirect')
def redirectfunc():
    return("<p>This is a redirect page</p>")

@app.route('/hello1')
def hello1():
    print("redirect...")
    return '', 302, {'Location': 'http://127.0.0.1:5000/redirect'}

if __name__ == '__main__':
    app.run(debug=True)

 

 

运行结果:

 

 

1.2第二种方式

from flask import Flask,redirect,url_for

app=Flask(__name__)

@app.route('/hello3/',endpoint='world')
def hello3():
    print(url_for('redirectfun'))  # url_for(端点名)--》返回端点对应的url规则
    return redirect(url_for('redirectfun'))#重定向到/redirect

@app.route('/redirect')
def redirectfun():
    return "<p>This is a redirect page</p>"

if __name__ == '__main__':
    app.run(debug=True)

运行结果:

 

 1.2.1断点说明

断点名默认为视图函数名,除非设置了endpoint(在路由装饰器里,设置endpoint=helloendpoint)

效果如下

 

都指定endpoint的话,记得设置下,否则会报错

 

 

二、返回指定状态码

from flask import Flask
from flask import abort

app=Flask(__name__)

@app.route('/404')
def not_found():
    abort(404)

if __name__ == '__main__':
    app.run(debug = True)

运行结果:

 

 

三、手动设置环境配置

管理环境变量

用来管理环境变量:pipenv install python-dotenv

 

 

1、手动新增.flask.env文件和.env文件

 

 

.flaskenv下增加如下内容(.env的优先级比.flask.env的优先级要高)

FLASK_ENV=development

指定是开发环境

此时重新加载app.py启动

app.run()即使没声明debug=true,也会默认把debug模式打开

 

 

加上环境变量之后 ,线上环境要改成production!!!

 

if __name__ == '__main__':
    app.run(debug = True)  # 增加上述环境变量后就不需要手动指定debug=True

 

 

app.py文件内容

 

from flask import Flask

app=Flask(__name__)

@app.route('/hello')
def not_found():
    d={'user1':"asdf",'user2':"xiaogang"}
    return d[3]

if __name__ == '__main__':
    app.run()

 

 

Debug模式开启后,如果报错会出现下面的情况

 

 

 

 

 

 

 

 

输入如上的PIN码,即可查看到错误日志内容

 

 

可以在线进行调试,所有用户都可以

 

 

 

 

 四、响应返回格式设置(媒体类型)

 

 

 

from flask import Flask,make_response,json

app=Flask(__name__)

@app.route('/foo1')
def foo1():
    data={'name':'Sam Xia','gender':'male'}
    response = make_response(json.dumps(data))  # 将json格式转换为python字典
    response.mimetype = 'application/json'  # 这句话的含义是样式不同
    return response


from flask import jsonify
@app.route('/foo3')
def foo3():
    return jsonify(name = 'Sam Xia',gender = 'make')  # 返回json格式的

if __name__ == '__main__':
    app.run(debug = True)

运行结果如下:

 

 

 

 五、cookie相关

Session:在服务器端存储用户信息返回给浏览器(理解为一个加密的cookie

Cookie:客户请求到服务器的客户信息,浏览器就搞出来一些东西,存储在客户端

 

5.1、第一种形式

from flask import Flask,make_response,json,redirect,url_for

app=Flask(__name__)

@app.route('/hello1')
def hello1():
    data = {'name': 'Sam Xia', 'gender': 'male'}
    response = make_response(json.dumps(data))
    response.mimetype = 'application/json'
    print("dir(response): %s" % dir(response))
    print("respones.json: %s" % response.json)
    print("response.get_json(): %s" % response.get_json())
    print("response.is_json: %s" % response.is_json)
    return  response

@app.route('/hello/<name>')
def hello(name):
    return '<h1>Hello, %s !</hi>' %name

@app.route('/set/<name>')
def set_cookie(name):
    """执行这个请求的时候是服务器Set-Cookie 后返回给客户端,体现在response headers里;
    然后重定向了一次,体现在request headers里"""
    #url_for()方法的第一个参数是端点,视图函数名;第二个参数是该函数需要的参数
    response = make_response(redirect(url_for('hello', name = 'gloryroad')))
    #把url中name变量的值添加到cookie中name属性中
    response.set_cookie('username',name)
    return response

if __name__ == '__main__':
    app.run(debug = True)

 

运行结果如下:

 

 

 

 

 

 

5.1.1查看对应的cookie

 

 

 

 

 

 

5.2、第二种形式

 

from flask import Flask,make_response,redirect,url_for,request

app=Flask(__name__)

@app.route('/')  # 两个都可以访问,直接访问时不带参数,故username为None
@app.route('/hello')
def hello():
    username = request.args.get('username')
    print("username: %s" % username)
    if username is None:
        username = request.cookies.get('username','Human')#从cookie中获取username值,没有则返回‘Human’
    return '<h1>Hello, %s</hi>' % username


@app.route('/set/<name>')
def set_cookie(name):
    #url_for()方法的第一个参数是视图函数名,第二个参数是该函数需要的参数
    response = make_response(redirect(url_for('hello',username = '李白')))
    #把url中name变量的值添加到cookie中name属性中
    response.set_cookie('username',name)
    return response

if __name__ == '__main__':
    app.run(debug = True)

 

运行结果如下

 

posted @ 2022-04-21 00:58  翻滚的小强  阅读(218)  评论(0)    收藏  举报