请求响应,session,闪现

摘要:
请求相关#请求相关信息#请求。方法#请求。args#请求。表单#请求。values#请求。cookies#请求。headers#请求。路径#请求。full_ path#request.script _ root#request.url#request.base _ url#request.url_ root#req

请求相关

 # 请求相关信息
        # request.method
        # request.args
        # request.form
        # request.values
        # request.cookies
        # request.headers
        # request.path
        # request.full_path
        # request.script_root
        # request.url
        # request.base_url
        # request.url_root
        # request.host_url
        # request.host
        # request.files
        # obj = request.files['the_file_name']
        # obj.save('/var/www/uploads/' + secure_filename(f.filename))

响应相关

# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
#return jsonify({'k1':'v1'})

如果想写cooike,写headers,先用make_response包装一下
# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['XXXXXX'] = 'YYYYYY'
# return response
return "内容"
请求响应,session,闪现第1张请求响应,session,闪现第2张
from flask import Flask,request

app=Flask(__name__)

@app.route('/',methods=['GET','POST'])
def index():
    print(request.args)        #ImmutableMultiDict([('name', 'pdun')])
    print(request.form)        # ImmutableMultiDict([('age', '1')])
    print(request.method)     #POST
    print(request.values)
  #CombinedMultiDict([ImmutableMultiDict([('name', 'pdun')]), ImmutableMultiDict([('age', '1')])])


    print(request.cookies)
    print(request.headers)
    print(request.path)
    print(request.full_path)
    print(request.script_root)
    print(request.url)                    #http://127.0.0.1:5000/?name=pdun
    print(request.base_url)            #http://127.0.0.1:5000/
    print(request.url_root)             #http://127.0.0.1:5000/
    print(request.host_url)               #http://127.0.0.1:5000/
    print(request.host)                    #127.0.0.1:5000
    print(request.files)
    return 'ok'

if __name__ == '__main__':
    app.run()
View Code
 二、session

Flask中的session非常奇怪,他会将Session存放在客户端的Cookie中,使用起来也非常奇怪

1、Flask中的session是需要secret

from flask import session
app = Flask(__name__)
app.secret_key = "dsfsdgfsdgfg"

#secret_key 实际上是用来加密字符串的,如果在实例化的app中没有 secret_key 那么开启session一定会抛异常的

2、session要这样用

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]:
            session["user"] = USER["username"]
            return redirect("/student_list")
        return render_template("login.html", msg="用户名密码错误")

    return render_template("login.html", msg=None)  # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg

3、cookie中的session到底是什么

#cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息

4、用session进行验证

@app.route("/student_list")
def student():
    if session.get("user"):
        return render_template("student_list.html", student=STUDENT_DICT)

    return redirect("/login")

session的简单使用

from flask import Flask,session

app=Flask(__name__)
app.secret_key='sdfgfsfdgs'      #需要写这么一步
@app.route('/')
def index():
    session['name']='pdun'
    return 'index'


@app.route('/text',methods=['GET','POST'])
def text():
    print(session['name'])
    return 'text'
if __name__ == '__main__':
    app.run()

session源码

请求响应,session,闪现第3张请求响应,session,闪现第4张
如果不想把数据存放到cooike,存到redis等,写一个类
app.session_interface=自己写的类,类中至少实现以下两个方法
 def open_session(self, app, request):
 def save_session(self, app, session, response): 


------------------------------------------------------
读源码,

app.session_interface                #点进去,
session_interface = SecureCookieSessionInterface()   #点进去


class SecureCookieSessionInterface(SessionInterface):    #类中又三个方法
    def get_signing_serializer(self, app):

    def open_session(self, app, request):

    def save_session(self, app, session, response):     #先看第三个方法
        if not session:          #  1、判断服务端是否存有session    
            if session.modified:      #没有session,判断是否被修改
                response.delete_cookie(
                    app.session_cookie_name, domain=domain, path=path
                )           #把cookie删除,重新添加

            return    

        if session.accessed:       #2、有session
            response.vary.add("Cookie")      #添加cooike

        if not self.should_set_cookie(app, session):
            return

        httponly = self.get_cookie_httponly(app)       #这几个是限制条件
        secure = self.get_cookie_secure(app)
        samesite = self.get_cookie_samesite(app)
        expires = self.get_expiration_time(app, session)
        val = self.get_signing_serializer(app).dumps(dict(session))
        response.set_cookie(
            app.session_cookie_name,
            val,
            expires=expires,
            httponly=httponly,
            domain=domain,
            path=path,
            secure=secure,
            samesite=samesite,
------------------------------------------------------------------
看看类中的第二个方法
    def open_session(self, app, request):
        s = self.get_signing_serializer(app)
        if s is None:
            return None
        val = request.cookies.get(app.session_cookie_name)     #取val
        if not val:       #判断val是否存在
            return self.session_class()
        max_age = total_seconds(app.permanent_session_lifetime) #是否超时
        try:
            data = s.loads(val, max_age=max_age)
            return self.session_class(data)
        except BadSignature:
            return self.session_class()
View Code
闪现(基于session)
#应用:对临时数据操作,如:展示错误信息

from flask import Flask,flash,get_flashed_messages
    设置:flash('设置值')
    取值:get_flashed_message()  

#存几次,几次就能取完

示例

请求响应,session,闪现第5张请求响应,session,闪现第6张
from flask import Flask,session,flash,get_flashed_messages

app=Flask(__name__)
app.secret_key='sdfgfsfdgs'       #基于session,所以要加上加密方式
@app.route('/')
def index():
    flash('存值')
    return 'index'


@app.route('/text',methods=['GET','POST'])
def text():
    data=get_flashed_messages()

    print(data)
    return 'text'

@app.route('/text2',methods=['GET','POST'])
def text1():
    data=get_flashed_messages()
    flash('我也放一次,看text能不能取')
    print(data)
    return 'text2'
if __name__ == '__main__':
    app.run()
View Code

免责声明:文章转载自《请求响应,session,闪现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA中获取当前执行路径Web DNS 实战下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【原】移动web页面支持弹性滚动的3个方案

有段时间一直折腾移动端页面弹性滚动的各种问题,做了点研究,今天做个小分享~ 传统 pc 端中,子容器高度超出父容器高度,通常使用 overflow:auto 可出现滚动条拖动显示溢出的内容,而移动web开发中,由于浏览器厂商的系统不同、版本不同,导致有部分机型不支持对弹性滚动,从而在开发中制造了所谓的 BUG。   上图如果在PC端中,我们可以利用 pos...

Swift开发学习(二):Playground

http://blog.csdn.net/powerlly/article/details/29674253 Swift开发学习:Playground 关于 对于软件用户、游戏玩家,大家一直都在提倡用户体验。其实软件开发者自己也是用户,是各种开发工具的使用者,也会喜欢用户体验做得好的工具软件。这次苹果想开发者所想,提供了一个可以玩转swift的游乐场--P...

工具篇01-代码扫描工具Gamma

1. Gamma简介 Gamma是由Acellere开发的智能软件分析平台。 它通过加快代码审查,支持开发人员和团队在更短的时间内构建更高质量的软件。 它会自动对代码中的热点进行优先级排序,并提供清晰的可视化效果。 凭借其多向量诊断技术,它可以分析多个镜头的软件,包括软件设计,使公司能够透明地管理和改进其软件质量。 2. Gamma使用教程 1)注册账号...

DCM 图片查看

因为要处理一些医学图像,需要把dcm格式的文件转换成jpg格式。本来用Sante DICOM Editor用得挺好的,方便查看dcm文件,但是在转换上每次只能转一张(本人没有找到用该软件批量转格式的方法)。于是在网上搜集了各种软件(图片格式转换大师、DCM图片转换大师等等),要么是要付费的,要么就是有病毒。在线转换器最多只能转30张,多的就要付费。 最终发...

Android6.0 旋转屏幕(五)WMS启动应用流程(屏幕方向相关)

一、强制设置方向 1.Activity 如果要强制设置一个Activity的横竖屏可以通过Manifest去设置,跟Activity相关的信息都会保存在ActivityInfo当中。 android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait...

windows下的正则式工具介绍之一:RegexBuddy

俗话说,工欲善其事,必先利其器。关于windows下的正则表达式工具,这里推荐的是:RegexBuddy和PowerGREP。在linux下,也有好用的正则表达式工具,例如grep的兄弟们,只不过是都是基于命令行的。而这两款windows下的小工具,其突出特点是可视化,允许尝试和预览,极大地方便了使用者。 RegexBuddy:网址是http://www....