• 二、注册登录状态维持(template和session)


    from flask import Flask, render_template, session, request, redirect
    
    
    app = Flask(__name__)
    app.secret_key = "fafFAVGVvvbGbBfWFwvgWb"
    @app.route("/")
    def index():
        return "Hello World"
    
    
    #
    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            # ImmutableMultiDict([('name', 'Will'), ('name', 'Smith')])
            # 接收GET请求的参数
            # "GET /login?name=Will&name=Smith HTTP/1.1"
            print(request.args.get("name"))
            # Will
            print(request.args.getlist("name"))
            # ['Will', 'Smith']
            # 模板渲染,使用Jinjia2,
            return render_template("login.html")
    
        # ImmutableMultiDict([('username', 'admin')])
        # 接收POST请求的参数,可以直接使用get方法获取具体参数值
        print(request.form.get("name"))
        session["userInfo"] = {"username": "Will"}
        return redirect("/home")
    
    
    @app.route("/logout")
    def logout():
        del session["userInfo"]
        return redirect("/home")
    
    
    @app.route("/home")
    def home():
        userInfo = session.get("userInfo")
        print(userInfo)
        return render_template("home.html", **{"userInfo": userInfo})
    
    
    if __name__ == '__main__':
        app.run("localhost", 80, debug=True)

    1、template

    渲染模板的函数为render_template和render_template_string,传入渲染函数中的上下文必须使用下面两种形式(多采用第二种方式),与django不同。

    render_template("home.html", username="Will", age=20)
    
    render_template("home.html", **{"username":"Will", "age":20})

    模板文件默认放在当前目录下的templates子目录中,如果需要更改,可以在创建应用对象时,设置template_folder参数,将模板文件放在里面

    app = Flask(__name__, template_folder="templates")

    2、session

    flask的session跟django不同

    django是在cookie中设置一个sessionid,存放session的键,当浏览器发送请求,请求在到达视图函数时,会被相应的session中间键从数据库中根据sessionid取出当前请求用户的登录信息,这样就是可辨别是哪一个用户登录的。

    flask是在服务器中维护一个session,可以将其当做字典来使用,存储的值可以是任意的Python类型(包括字典、列表等),当一个请求到达时,就会将请求的cookie中的session信息存入服务器的session中,注意:flask的session信息是直接存储在客户端的,为了防止session信息泄露,必须要对session先序列化再加密,因此需要设置app.secret_key,可以随意设置,但是不得泄露。

    app = Flask(__name__)
    app.secret_key = "fafFAVGVvvbGbBfWFwvgWb"
    @app.route("/login", methods=["GET", "POST"])
    def login():
        if request.method == "GET":
            # ImmutableMultiDict([('name', 'Will'), ('name', 'Smith')])
            # 接收GET请求的参数
            # "GET /login?name=Will&name=Smith HTTP/1.1"
            print(request.args.get("name"))
            # Will
            print(request.args.getlist("name"))
            # ['Will', 'Smith']
            # 模板渲染,使用Jinjia2,
            return render_template("login.html")
    
        # ImmutableMultiDict([('username', 'admin')])
        # 接收POST请求的参数,可以直接使用get方法获取具体参数值
        print(request.form.get("name"))
        session["userInfo"] = {"username": "Will"}
        return redirect("/home")

    3、route

    flask使用装饰器与视图函数对应,如果app.route只传递rule字符串,那么只会默认通过GET请求,其他请求不会被允许通过,要是非GET请求通过,必须设置methods参数,

    @app.route("/login", methods=["GET", "POST"])

    视图函数是不用传request参的,因为都是直接导入的,

    from flask import Flask, render_template, session, request

    那如何接收GET、POST传递的参数呢?

    # ImmutableMultiDict([('name', 'Will'), ('name', 'Smith')])
    # 接收GET请求的参数
    # "GET /login?name=Will&name=Smith HTTP/1.1"
    print(request.args.get("name"))
    # Will
    print(request.args.getlist("name"))
    # ['Will', 'Smith']
    # ImmutableMultiDict([('username', 'admin')])
    # 接收POST请求的参数,可以直接使用get方法获取具体参数值
    print(request.form.get("name"))

    重定向?

    from flask import Flask redirect
    @app.route("/logout")
    def logout():
        del session["userInfo"]
        return redirect("/home")
  • 相关阅读:
    AngularJS 用 $http.jsonp 跨域SyntaxError问题
    jQuery调用WCF需要注意的一些问题
    WCF 添加 RESTful 支持,适用于 IIS、Winform、cmd 宿主
    搭建个人博客-hexo+github
    Git错误提示之:fatal: Not a git repository (or any of the parent directories): .git
    C# WCF 完整实例,winform 窗体作为 宿主
    【WCF】HTTP 无法注册 URL 进程,不具有此命名空间的访问权限
    Jsoncpp Compiler、Programming
    CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root
    Linux UserSpace Back-Door、SSH/PAM Backdoor/Rootkit、SSH Session Hijacking技术研究
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/13366468.html
Copyright © 2020-2023  润新知