码迷,mamicode.com
首页 > 其他好文 > 详细

Flask框架

时间:2018-08-20 23:50:24      阅读:871      评论:0      收藏:0      [点我收藏+]

标签:cli   size   wsgi   优势   websocket   lse   word   速度   templates   

Flask框架:

python三大框架优缺点

  Flask:

    优点: 小而精,短小精悍,第三方组件特别多

    缺点: 组件更新速度取决于开源者 

  Tornado:

    优点: 原生的WebSocket, 异步任务, IO非阻塞玩

    缺点: 没有组件,Session都没有

  Django:

   优点: 大而全,组件非常全面

    缺点: 太大,重量级框架,加载太大,浪费资源

 Flask的优势:

Flask的优势
Flask中的Werkzuge原理,__call__()
Flask的第一个Hello OldBoyEDU
Flask的 HTTPresponse render_template redirect
Flask中的 request
Flask中的 Jinja2 ,Markup
Flask中的 session secret_key
Flask中的路由系统 url_for

Werkzuge:

技术分享图片
from werkzeug.wrappers import Response, Request
from werkzeug.serving import run_simple


# application源码里面 get_wsgi_headers 里面有个__call__方法
# 可以调用__call__ 在执行flk的时候执行call里面的结果
@Request.application
def flk(r):
    print(r.url)
    if r.url == /123:
        asd()
    return Response("hello")

# flk
run_simple("127.0.0.1", 5500, flk)


def asd():
    print(kermit)


asd()
View Code

 

Flask三剑客:

HTTPresponse: return "Hello OldBoyEDU"
render_template: return render_template("login.html") #templates
redirect: return redirect("/login")

# Httpresponse
@apl.route("/index")
def index():
    return "Hello OldBoyEDU"


# render_template
@apl.route("/login")
def login():
    return render_template("login.html")


# redirect
@apl.route("/")
def root_path():
    return redirect("/login")

Flask需要自己开启:(必走流程)

from flask import Flask, render_template, redirect
apl = Flask(__name__)
apl.run()  # 可以自定义ip 端口  和debug模式

Request:
request.method 获取请求方式
request.form 获取FromData数据(通常情况下的POST请求)
request.args 获取GET方式提交的数据
request.files 获取file
request.url_about 获取所有的关于URL的参数
request.values 获取全部提交方式
to_dict 坑,覆盖,GET覆盖POST
request.headers 获取头部信息
request.cookie 获取客户端cookie
request.json 数据头:application/json
request.data 在没有任何数据头的情况提交的POST

模板语言:

Flask 基于 Jinja2 做了一层小小小小小小的封装
向前端传递数据 render_template 参数传递 stu = {k1:v1}
{{ stu }}
    <td>{{ stu.name }}</td>
    <td>{{ stu["age"] }}</td>
    {% if stu.get("gender") == ""  %}
        <td>男</td>
    {% else %}
        <td>{{ stu.get("gender") }}</td>
    {% endif %}
    
    
    STUDENT_LIST = [
        {name: Old, age: 38, gender: },
        {name: Boy, age: 73, gender: },
        {name: EDU, age: 84, gender: }
    ]
    
    <td>{{ stu.0.name }}</td>
    <td>{{ stu[0]["age"] }}</td>
    {% if stu[0].get("gender") == ""  %}
        <td>男</td>
    {% else %}
        <td>{{ stu.0.get("gender") }}</td>
    {% endif %}

@apl.template_global() def a_b_sum(a,b): return a+b {{ a_b_sum(123,234) }} @apl.template_filter() def a_b_c_sum(a,b,c): return a+b+c {{ 123 | a_b_c_sum(1,2) }}
 安全字符串:Markup 相当于 模板里面有 safe
    {{ input | safe }}
    Markup() : Markup("<input type=‘text‘ name=‘input_tag‘>")

 

 

为了让pycharm识别模板语言的格式:设置jinja2的语言技术分享图片

 

Sessionsecret_key="" 这个是开启session必备的参数

  form flask import session
    app.secret_key = "随意"
    session["user"] = "xxxx"
    if session.get("user")

 

Flask 路由 :

 flk.route()

"/index"  路由地址
"/index/<nid>"   动态路由地址(视图函数需要nid参数)
"/index/<int:nid>"   动态路由地址

 

methods=["GET","POST"]   允许URL的请求方式
endpoint="index"   反向URL操作,可以解决Inner重名的问题
redirect_to="/index2"   服务器端页面跳转  301永久性重定向
strict_slashes=False   可以使用"/"结尾 反之不可以
defaults={"nid":1}   视图函数默认参数

 

 

 

 

 所以例子:

技术分享图片
from flask import Flask, Markup, render_template, redirect, request, session, url_for

flk = Flask(__name__)
flk.secret_key = "Dragon"  # 开启session必备的参数

STUDENT = {name: Old, age: 38, gender: }

STUDENT_LIST = [
    {name: Old, age: 38, gender: },
    {name: Boy, age: 73, gender: },
    {name: EDU, age: 84, gender: }
]

STUDENT_DICT = {
    1: {name: Old, age: 38, gender: },
    2: {name: Boy, age: 73, gender: },
    3: {name: EDU, age: 84, gender: },
}


# 用template_global 可以直接在模板调用这个函数作为参数
# {{ a_b_sum(11,22) }}  33
@flk.template_global()
def a_b_sum(a, b):
    return a + b


# template_filter  可以直接在模板调用这个函数作为参数 + | 前面的数字
# {{ 22 | a_b_c_sum(11,22) }}  55   也就是参数a是22
@flk.template_filter()
def a_b_c_sum(a, b, c):
    return a + b + c


# 装饰器
def wra(func):
    print(外部)

    def inner(*args, **kwargs):
        print(内部)
        if session.get(user):
            return func(*args, **kwargs)
        return redirect(/login)

    return inner


# 添加 endpoint 参数 是为了如果所有视图都用同一个装饰器会走inner函数,
# 然后会重名,为了给它设置不同的名称
@flk.route("/index/<string:nid>", endpoint="index1")
@wra  # inner = wra(index)
def index(nid):
    # url_for是访问的url相对路径 参数与route的url得一直
    print("nid", url_for("index1", nid=nid))
    # Markup就是在后端写前端页面并且加了safe
    input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>")
    return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag)


@flk.route("/index2", endpoint="index2")
@wra  # inner = wra(index)
def index2():
    # Markup就是在后端写前端页面并且加了safe
    input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>")
    return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag)


@flk.route("/index3", endpoint="index3")
@wra  # inner = wra(index)
def index3():
    # Markup就是在后端写前端页面并且加了safe
    input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>")
    return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag)


@flk.route(/login, methods=[GET, POST])
def login():
    if request.method == GET:
        return render_template(login.html)
    else:
        # login.html指定了multipart/form-data,所以可以通过request.form来获取
        username = request.form[user]
        password = request.form[pwd]
        if username == kermit and password == 123:
            session[user] = username
            return redirect(/index)

        if username == egon and password == 123:
            session[user] = username
            return redirect(/index)

        return render_template(login.html, msg="用户名密码错误!!!")

if __name__ == __main__:
    flk.run(debug=True)
View Code

 

Flask框架

标签:cli   size   wsgi   优势   websocket   lse   word   速度   templates   

原文地址:https://www.cnblogs.com/kermitjam/p/9508827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!