zoukankan      html  css  js  c++  java
  • flask基础-第一个flask-jinja2-response三剑客-request-session

    主要内容:

      1.flask 第一个小程序

      2.response三剑客:

          response,render_template,redirect

      3.request

      4.Jinja2

      5.session

    一.flask 第一个小程序

      1)安装flask  pip3 install flask

      2)导入flask 

          from flask import Flask

        

    from flask import Flask
    
    app = Flask(__name__)
    
    app.run()
    
    
    ###右键运行就可以了

      在上面的基础上设置路由

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "这是首页"
    
    app.run()
    
    
    ###@app.route("/home",methods=["GET","POST"])
    ###上面是路由设置

    二.response三剑客以及相关子设置.

        关于模板的设置,默认是需要是需要在项目下建立一个文件夹,文件夹必须为templates,在pycharm中如果设置自动提醒的话,需要右键点击templates选择mark directory as   --------templates floder.

      关于三剑客的设置参考如下:

    from flask import Flask,render_template,redirect,send_file,jsonify,request
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        return "这是首页"    ###相当于HttpResponse
    
    @app.route("/login")
    def login():
        return render_template("login.html")   ##需要导入render_template,然后在templates里面写入html文件
    
    
    @app.route("/home",methods=["GET","POST"])
    def home():
        username = request.form.get("name")
        pwd = request.form.get("password")
        if username == "leon" and pwd == "leon":
            return redirect("/index")   #导入redirect 后,做个跳转
        return "错误哦"
    app.run()

    关于send_file和jsonify

    return send_file("2.mp3") # 打开文件并返回客户端

    return jsonify({"name":"yinwangba"}) # 返回标准的json格式字符串 content-type: application/json

    示例如下:

    from flask import Flask,render_template,redirect,send_file,jsonify,request
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        return "这是首页"    ###相当于HttpResponse
    
    @app.route("/login")
    def login():
        return render_template("login.html")   ##需要导入render_template,然后在templates里面写入html文件
    
    
    @app.route("/home",methods=["GET","POST"])
    def home():
        username = request.form.get("name")
        pwd = request.form.get("password")
        if username == "leon" and pwd == "leon":
            return redirect("/index")   #导入redirect 后,做个跳转
        return "错误哦"
    @app.route("/getfile")
    def getfile():
        return send_file("day115.txt")
    
    @app.route("/getjson")
    def getjson():
        a = {"k":"v"}
        return jsonify(a)
    
    
    app.run()

    三.request  

    这里需要注意的是request并不是作为参数传入的,而是request作为池子调用的,需要的时候去到池子里面去取的

                # print(request.form) # form 存放form表单中的序列化数据
                # print(request.args) # args 存放URL中的序列化数据
                # print(request.values) # values 存放URL和form表单中的序列化数据
                # print(request.method) # method 存放请求方式
                # print(request.path) # path 路由地址
                # print(request.url) # url 请求全部地址 http://127.0.0.1:5000/home?id=jwb&username=ywb
                # print(request.host) # host 主机位 127.0.0.1:5000
                # print(request.host_url) # host_url 将主机位转成url http://127.0.0.1:5000/
                # print(request.data) # data 当请求头content-type无法被识别时
                # print(request.json) # json 当请求头content-type:application/json
                # print(request.headers) # headers 查看请求头
                # print(request.files.get("file")) # files 获取文件对象
                # file = request.files.get("file")
                # file.save(file.filename)  #存储文件

    测试示例如下:

    from flask import Flask,render_template,redirect,send_file,jsonify,request
    
    app = Flask(__name__)
    
    @app.route("/index")
    def index():
        return "这是首页"    ###相当于HttpResponse
    
    @app.route("/login")
    def login():
        return render_template("login.html")   ##需要导入render_template,然后在templates里面写入html文件
    
    
    @app.route("/home",methods=["GET","POST"])
    def home():
        username = request.form.get("name")
        pwd = request.form.get("password")
        print("**********************************")
        print("request form",request.form)
        print("request args",request.args)
        print("request values",request.values)
        print("request method ",request.method)
        print("request path",request.path)
        print("request url",request.url)
        print("request host_url",request.host_url)
        print("request.data",request.data)
        print("request headers",request.headers)
    
        print("***********************************")
        if username == "leon" and pwd == "leon":
            return redirect("/index")   #导入redirect 后,做个跳转
        return "错误哦"
    @app.route("/getfile")
    def getfile():
        return send_file("day115.txt")
    
    @app.route("/getjson")
    def getjson():
        a = {"k":"v"}
        return jsonify(a)
    
    
    app.run()
    
    
    """
    运行结果如下:
    **********************************
    127.0.0.1 - - [20/Nov/2018 15:57:33] "GET /index HTTP/1.1" 200 -
    request form ImmutableMultiDict([('name', 'leon'), ('password', 'leon'), ('file', '')])
    request args ImmutableMultiDict([('v1', '1'), ('token', 'hehe')])
    request values CombinedMultiDict([ImmutableMultiDict([('v1', '1'), ('token', 'hehe')]), ImmutableMultiDict([('name', 'leon'), ('password', 'leon'), ('file', '')])])
    request method  POST
    request path /home
    request url http://127.0.0.1:5000/home?v1=1&token=hehe
    request host_url http://127.0.0.1:5000/
    request.data b''
    request headers Host: 127.0.0.1:5000
    Connection: keep-alive
    Content-Length: 382
    Cache-Control: max-age=0
    Origin: http://127.0.0.1:5000
    Upgrade-Insecure-Requests: 1
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryivB199QYMwLFX1yt
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Referer: http://127.0.0.1:5000/login
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    Cookie: csrftoken=7PvuH3f1qTGBzyaSlBSnfgoRaCP5TkN6f0LT9WsG7Rwl1imm7e6H2O2WrgtzMYa8
    
    
    ***********************************
    """

    测试file的示例如下:

        if username == "leon" and pwd == "leon":
            file = request.files.get("file")#这里是获取文件对象
            file.save(file.filename)#这里是存储
            return redirect("/index")   #导入redirect 后,做个跳转

     四.Jinja2 的使用

      jinja2和django 的templates很像.

       这里大概介绍一下语法如下:

          {{}} 引用变量 非逻辑代码时使用 

          {%%} 逻辑代码使用

          | safe 

          Markup : from flask import Markup 后台返回安全标签字符串

          {% block jj2 %}

          {% include "login.html" %}

               

        {% macro func(name,type_name) %}
        <input type="{{ type_name }}" name="{{ name }}">
        <input type="submit" value="提交文件">
        {% endmacro %}
        {{ func("file","file") }}

    下面举例如下:

        

    """
    参考数据如下:
    STUDENT = {'name': 'leon', 'age': 18, 'gender': 'man'}
    STUDENT_LIST = [
        {'name': 'ben', 'age': 18, 'gender': "mid"},
        {'name': 'roy', 'age': 23, 'gender': 'female'},
        {'name': 'leon', 'age': 34, 'gender': '女'}
    ]
    
    STUDENT_DICT = {
        1: {'name': 'tim', 'age': 18, 'gender': 'mid'},
        2: {'name': 'leon', 'age': 23, 'gender': 'man'},
        3: {'name': 'roy', 'age': 34, 'gender': 'female'},
    }
    """"
    
    ###index里面的代码如下
    {{ stu }}
    获取字典的三种方法
    <br>
    1   {{ stu.name }}
    <br>
    2   {{ stu.get("age") }}
    <br>
    3 {{ stu["gender"] }}

     下面是表格显示列表和字典的数据.这里需要注意的是,如果在循环中引用的话,不能使用.name的方式的.

    示例如下

    <table border="1px">
        <thead>
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
            </tr>
        </thead>
        <tbody>
    
                {% for stu_li in stu_list %}
                    <tr>
                    <td>{{  stu_li.name}}</td>
                    <td>{{ stu_li.get("age") }}</td>
                    <td>{{ stu_li["gender"] }}</td>
                    </tr>
                {% endfor %}
    
        </tbody>
    </table>
    
    
    <table border="1px">
        <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
            </tr>
        </thead>
        <tbody>
    
                {% for stu_d in stu_dic %}
                    <tr>
                    <td>{{ stu_d }}</td>
                    <td>{{  stu_dic.get(stu_d).name}}</td>
                    <td>{{ stu_dic[stu_d].age }}</td>
    {#                <td>{{ stu_dic.get(stu_d).gender }}</td>#}
                    <td>{% if stu_dic.get(stu_d).gender != "中" %}
                        {{stu_dic.get(stu_d).gender}}
                        {% else %}
                        不存在
    
                    {% endif %}</td>
                    </tr>
                {% endfor %}
    
        </tbody>
    </table>

    关于jinja2中如果引入标签,

    如果在前端的话,示例如下:

    """
    html前端代码如下
    """
    {{ a|safe }}
    
    
    flask后端代码如下:
    @app.route("/jinja",methods=["GET","POST"])
    def jinja():
        a = "<a href='http://www.baidu.com'>123</a>"
        a = Markup(a)
        return render_template("jinja.html",stu=STUDENT,stu_list = STUDENT_LIST,stu_dic = STUDENT_DICT,a=a )

    如果在后端的话实现的话是通过导入Markup来实现的.

    from flask import Flask,render_template,redirect,request,send_file,jsonify,Markup,session
    @app.route("/jinja",methods=["GET","POST"])
    def jinja():
        a = "<a href='http://www.baidu.com'>123</a>"
        a = Markup(a)
        return render_template("jinja.html",stu=STUDENT,stu_list = STUDENT_LIST,stu_dic = STUDENT_DICT,a=a )

    还有一个概念宏定义:

    示例代码如下:

    {% macro func(name,type_name) %}
        <input type="{{ type_name }}" name="{{ name }}">
        <input type="submit" value="提交文件">
    {% endmacro %}
    <form action="post">
        {{ func("file","file") }}
    </form>

    五.session组件.

    session组件需要注意两件事情,

    1是session组件需要设置app.secret_key

    2是session被序列化后存放在 浏览器的cookie中的.

    示例如下:

    from flask import Flask,render_template,redirect,request,send_file,jsonify,Markup,session
    
    app.secret_key = "leon"
    
    
    ####seesion写入
    @app.route("/home",methods=["GET","POST"])
    def home():
        name = request.form.get("name")
        pwd = request.form.get("password")
        if name == "leon" and pwd == "leon":
             # file = request.files.get("file")
                session["user"] = name
                # file.save("123.txt")
                return redirect("/index")
        return "登录失败的!"
    
    ####session验证如下:
     if session.get("user"):
                return ""ok""

    六.特殊装饰器

    特殊装饰器:
    @app.template_global()
    def a_and_b(a,b):
    return a+b

    @app.template_filter()
    def abc(a,b,c):
    return a+b+c

    示例::

    #在flask后端Py文件里写如下代码:
    @app.template_global()
    def a_b(a,b):
        return a+b
    
    #在前端index页面写如下引用
    {{ a_b(1,2) }}
    
    
    第二个
    #在flask后端Py文件里写如下代码:
    @app.template_filter()
    def abc(a,b,c):
        return a+b+c
    
    #在前端index页面写如下引用
    {{ a_b(1,2 )| abc(1,1) }}
  • 相关阅读:
    https 适配
    SDWebImage 的简单使用方法
    第三方API使用的好习惯
    关于IPicture::Render函数
    标准模板库(STL)MAP容器使用详解
    STL容器
    c++ 遍历map的时候删除元素
    C++的try_catch异常
    Makefile 自动生成头文件的依赖关系 .
    调试过程中,内存泄露检测信息
  • 原文地址:https://www.cnblogs.com/ahliucong/p/9988934.html
Copyright © 2011-2022 走看看