zoukankan      html  css  js  c++  java
  • flask(一)

    一.python现阶段三大主流框架Django Tornado Flask的对比

    特点:
    1.Django的特点是大而全,集成了很多组件,属于全能型框架
    2.tornado的主要特点是原生异步非阻塞,在IO密集型和多任务处理上占有绝对优势,属于专注型框架
    3.flask的的特点是小而轻,原生组件几乎为0
    ​
    使用类型:
    1.Django适用于大型的web应用,由于内部的组件足够强大,可以使开发一气呵成
    2.tornado适用于api后端应用,常服务于游戏后台,因为内部的异步非阻塞非常稳
    3.简单的应用用flask非常简洁,大型的应用Django和flask都可以
    ​
    缺点:
    1.djnago的缺点是资源一次性全部加载,会造成资源浪费
    2.tornado太干净了,连个session都不支持
    3.flask相对不稳当,由于依赖第三方

    二.下载

    pip3 install flask

    第三方组件:http://flask.pocoo.org/

     

    三.简单实现

    1.三行启动flask

    from flask import Flask ,jsonify
    app = Flask(__name__)
    app.run(debug=True)

    2.六行带视图函数

    from flask import Flask  #导入flask类
    app = Flask(__name__)  #实例化一个flask对象app
    ​
    @app.route("/")  #router装饰器
    def index():  #视图函数
        return "aaa"
    ​
    app.run("0.0.0.0",5000,debug=True)  #启动flask web应用

    四.Flask中的Render Redirect HttpResponse

    1.Flask中的HttpResponse其实 就是直接返回字符串

    @app.route("/")  
    def index():  
        return "aaa"

    2.Flask中的Redirect

    from flask import Flask,redirect
    ​
    app = Flask(__name__)
    ​
    @app.route("/")
    def index():
        return redirect("/index") #在访问"/"时,重定向到"/index"
    ​
    @app.route("/index")
    def index1():
        return "重定向"
    ​
    app.run("0.0.0.0",5000,debug=True)

    3.Flask中的render

    from flask import Flask,render_template
    ​
    app = Flask(__name__)
    ​
    @app.route("/index")
    def index1():
        return render_template('index.html')
    ​
    app.run("0.0.0.0",5000,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    </body>
    </html>

    4.除Render Redirect HttpResponse外,Flask特有的jsonify与senf_file

    (1)jsonify(与json.dumps不同的是会有请求头application/json)

    from flask import Flask,render_template,jsonify
    ​
    app = Flask(__name__)
    ​
    @app.route("/")
    def index1():
        return jsonify({"aa":1})
    ​
    app.run("0.0.0.0",5000,debug=True)

    (2)send_file

    from flask import Flask,render_template,send_file
    ​
    app = Flask(__name__)
    ​
    @app.route("/")
    def index1():
        name="shy"
        return send_file("dvd.mp4")
    ​
    app.run("0.0.0.0",5000,debug=True)

    send_file可以返回文字,文件,图片,视频等等,自动识别文件是什么类型的文件,在Content-Type:后加文件类型

     

    五.八种请求方式

    get post delete put
    option trace connnect head

    methods参数

    from flask import Flask,render_template,send_file
    app = Flask(__name__)
    ​
    @app.route("/",methods=["POST"])#规定了methods参数后,其他请求就无法访问该视图函数
    def index1():
        name="shy"
        return send_file("dvd.mp4")
    ​
    app.run("0.0.0.0",5000,debug=True)

    六.request的使用(公共变量)

    request.method:获取请求方式的名字
    ​
    request.form:存放formdata中的数据(前端中表单中的数据)
    ​
    request.args:获取url中的数据 如:ImmutableMultiDict([('a', '1')]),可以to_dict()转化成字典
    ​
    request.url:访问的完整路径 如:http://127.168.13.61:5000/?a=1
    ​
    request.path:路由地址 如:/index
    ​
    request.host:主机地址 如:127.168.13.61:5000
    ​
    request.host-url:http+主机地址 如:http://127.168.13.61:5000/index
    ​
    request.json:如果请求头中的contentType:aplication/json,直接序列化
    ​
    request.data:如果请求头中的contentType:aplication/dfsg,不知道怎么序列化时无法被识别,请求体中的原始数据放到这
    ​
    request.values:用于查看数据通常不用来获取数据 如:CombinedMultiDict([ImmutableMultiDict([('a', '1')]), ImmutableMultiDict([])])
    ​
    request.files:获取文件信息
    ​
    request.cookies:获取cookie中的数据
    ​
    request.headers:获取请求头

    注:to_dict方法

    to_dict方法:类似这样ImmutableMultiDict,CombinedMultiDict,像字典一样的数据类型,都可以使用to_dict方法,request.values.to_dict():会出现覆盖问题
     

    七.jinja2语法(与template几乎一模一样!!!)

    1.引用变量(字典的传递)

    from flask import Flask,redirect,render_template,request
    ​
    app = Flask(__name__)
    ​
    STUDENT = {'name': 'Old', 'age': 38, 'gender': ''}
    ​
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html',stu=STUDENT)
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    <table>
        <tr>
            <td>{{ stu.name }}</td>
            <td>{{ stu.age }}</td>
            <td>{{ stu.gender }}</td>
        </tr>
        <tr></tr>
    </table>
    </body>
    </html>

    2.逻辑代码(列表的传递)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    <table>
        <tr>
            <td>{{ stu.name }}</td>
            <td>{{ stu.age }}</td>
            <td>{{ stu.gender }}</td>
        </tr>
        {% for foo in lis %}
        <tr>
        <td>{{ foo.name }}</td>
        <td>{{ foo.age }}</td>
        <td>{{ foo.gender }}</td>
        </tr>
        {% endfor %}
    ​
    ​
    </table>
    </body>
    </html>

    3.Markup的使用(相当于 |safe,安全标签字符串)(标签字符串的传递)

    from flask import Flask,redirect,render_template,request,Markup
    ​
    app = Flask(__name__)
    ##############################
    word="<p>hahaha</p>"
    word1=Markup(word)
    ##############################
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html',stu=STUDENT,lis=STUDENT_LIST,word=word1)
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    ##########################
    {{ word }}
    ##########################
    </body>
    </html>

    4.函数的传递

    (1)单个函数的传递

    from flask import Flask,redirect,render_template,request,Markup
    ​
    app = Flask(__name__)
    ​
    def add(a,b):
        return a+b
    ​
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html',func=add)
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    {{ func(1,2) }}
    </body>
    </html>

    (2)template_global,如果数量多的话,变成全局都可以使用的函数

    from flask import Flask,redirect,render_template,request,Markup
    ​
    app = Flask(__name__)
    ​
    #############################
    @app.template_global()#template_global是一个特殊的装饰器
    def add(a,b):
        return a+b
    ##############################
    ​
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html')
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    {{ add(2,2) }}
    </body>
    </html>

    (3)可以传递参数的全局函数

    from flask import Flask,redirect,render_template,request,Markup
    ​
    app = Flask(__name__)
    ​
    @app.template_filter()
    def fil(a,b,c):
        return a+b+c
    ​
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html')
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    {{ 1 |fil(2,3) }}
    </body>
    </html>

    5.宏macro

    from flask import Flask,redirect,render_template,request,Markup
    ​
    app = Flask(__name__)
    ​
    @app.route("/login",methods=["GET","POST"])
    def login():
        print(request.form)
        if request.method=="GET":
            return render_template('login.html')
        if request.form.get("username")=="aaa" and request.form.get("password")=="111":
            return redirect('/index')
        else:
            return "登录失败"
    @app.route("/index")
    def index():
        return render_template('index.html')
    ​
    app.run("0.0.0.0",5002,debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div>这是index.html</div>
    学生信息{{ stu }}
    #################定义宏#####################
    {% macro create_input(na,ty) %}
    用户名:{{ na }}<input type="{{ ty }}" name="{{ na }}">
    {% endmacro %}
    ##################给宏传值#####################
    {{ create_input("username","text") }}
    </body>
    </html>

     

    八.session(公共变量)

    from flask import session
    app = Flask(__name__)
    app.secret_key = "DragonFire"  #用来加密的字符串

    设置session

    session["username"]="shy"

    获取session

    session.get("username")#如果出现KeyError,说明没有这个key的session

    session机制:flask中的session是存储在cookie中的,为了节省flask的开销

     

     

     

     

     

     

     

  • 相关阅读:
    iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)
    iOS中 学会如何对sqlite3 进行封装
    杭电ACM2012素数判定
    杭电ACM2503a/b+c/d
    杭电ACM2005第几天
    杭电ACM2034人见人爱AB
    杭电ACM2502月之数
    杭电ACM2001计算两点间的距离
    杭电ACM2002计算求得体积
    杭电ACM2033人见人爱A+B
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/10218159.html
Copyright © 2011-2022 走看看